一、概述
EventBus 是一款针对Android优化的发布/订阅事件总线。主要功能是替
Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。
优点是开销小,代码更优雅。以及将发送者和接收者解耦。
现在我们使用3.0版本试试。
二、基本使用
-
gradle集成
compile 'org.greenrobot:eventbus:3.0.0'
-
自定义需携带传递的参数的类,因为传递的是一个对象,如:
public class FirstEvent{ private String mMsg; public FirstEvent(String msg){ mMsg = msg; } public String getmMsg(){ return mMsg; } }
-
在需要接收消息的Activity/Fragment中注册和反注册
- 在onCreate()中注册:
EventBus.getDefault().register(this);
- 在onDestroy()中反注册:
EventBus.getDefault().unregister(this);
- 在需要发送信息的时候:
EventBus.getDefault().post(event);
- 在onCreate()中注册:
-
重写回调的接收信息和处理的订阅函数,用 @Subscribe + 模式 修饰,如:
PS: 系统是根据@Subscriber这个注解来确定订阅函数的@Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(FirstEvent event) { String msg = "onEventMainThread收到了消息:" + event.getMsg(); Log.d("eventbus", msg); text1.setText(msg); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); }
@Subscribe(threadMode = ThreadMode.MAIN)
修饰的线程模式有4种: - ThreadMode.Main :表示这个方法在主线程中执行(适合做异步加载,可以将子线程 加载到数据直接设置到UI界面)。
- ThreadMode.Posting :表示该方法和消息发送方在同一个线程。
- ThreadMode.ASYNC :表示无论发送方是在子线程还是在主线程,都会开一个新的子线程去运行,适用于多个线程任务,内部有线程池管理,比如请求网络时,用这个方法,他会自动创建方法去请求,可以异步并发处理。
- ThreadMode.BackGround :表示该方法在后台运行(也就是子线程),不能够并发处理,如果发布者在子线程,那么该方法就在子线程执行。如果发布者在主线程,那么该方法就会创建一个子线程,在子线程运行。