EventBus简单使用
2016-08-05 17:22
417 查看
简介:
EventBus是基于观察者/订阅者模型1.订阅者订阅自己希望的事件类型,发布者将事件发送到EventBus后,由EventBus决定将事件交给哪个订阅者处理
2.使用EventBus,EventBus最常用的几个方法原型:
* EventBus.getDefault().register(Object subscriber);
* EventBus.getDefault().unregister(Object subscriber);
* EventBus.getDefault().post(Object event);
第一个为订阅者订阅事件,一旦在类中调用这个方法,EventBus就会遍历类中的方法,将声明为处理事件的方法存起来,等到有订阅者订阅的事件时,就会调用相应的方法处理
第二个为取消注册订阅事件
第三个为发送一个事件到EventBus
注:本文例子中EventBus均为3.X
简单例子
需求为点击第二个页面的按钮,改变第一个页面的文本显示首先需要定义事件类型,其实也是一个类:
package com.example.eventbussimple; /** * Created by user on 2016/8/4 004. */ public class EventBean { public EventBean(String name) { this.name = name; } public String name; }
第一页代码如下:
package com.example.eventbussimple; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; public class MainActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this);//订阅事件 textView = (TextView) findViewById(R.id.id_text1); findViewById(R.id.id_button1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this, Main2Activity.class)); } }); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this);//取消订阅事件 } //处理事件方法,在3.0以后都需要使用注解来表明这个 方法可以处理EventBus事件 //threadMode会在下面解释 @Subscribe(threadMode = ThreadMode.MAIN) public void handleMessage(EventBean event) { textView.setText(event.name); } }
第二页代码为
package com.example.eventbussimple; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import org.greenrobot.eventbus.EventBus; public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); Button button = (Button) findViewById(R.id.id_button); if (button != null) { //点击按钮发送事件 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post(new EventBean("xiaowj")); } }); } } }
至此,点击第二页按钮,第一页的文本就能变为xiaowj
EventBus的ThreadMode
细心的小伙伴在上面的例子中应该注意到了threadMode这个东西,简单来说就是指明处理事件的方法要在哪种线程中执行ThreadMode有四种枚举类型,下面会一一解释
ThreadMode.POSTING 事件处理函数在事件发送线程中执行。需要尽快处理事件,这种方式是同步调用处理函数,如果长时间处理事件会导致阻塞事件发送线程运行
ThreadMode.MAIN 事件处理函数在主线程中执行(UI线程)。这个不用说,事件处理函数需要尽快处理事件,不然会导致程序无响应
ThreadMode.BACKGROUND 如果发送事件线程是主线程,就新开线程处理这个事件,如果发送事件线程不是主线程,就在发送事件的线程中执行事件处理函数。这个模式也是需要尽快处理事件,如果发送事件线程不是主线程,会同步调用事件处理函数,如果没有快速处理事件, 同样会导致事件发送线程阻塞
ThreadMode.ASYNC 新开线程处理事件,如果事件需要长时间处理,建议选用这种模式开发
各位小伙伴可以根据上面描述选择合适的ThreadMode处理事件
题外话,下周会更新EventBus源码分析
相关文章推荐
- Android 中 EventBus 的使用之多线程事件处理
- EventBus3.0详解
- Spring4 版 eventbus 事件通信 事件驱动 介绍
- EventBus3.0学习笔记
- EventBus
- eventbus/documentation/delivery-threads-threadmode
- eventbus/documentation/how-to-get-started/
- EventBus Demo
- android EventBus
- EventBus基本设计思路
- EventBus(二)------从register这条线分析EventBus
- EventBus(三)-----从post这条线分析EventBus
- EventBus(四)-----简单应用
- EventBus的使用以及原理
- EventBus 学习
- EventBus 学习进阶
- EventBus使用小坑
- eventbus简单使用
- Android EventBus实战 没听过你就out了
- 都在说EventBus,我也来一波EventBus