EventBus3.0的使用详解
2016-10-05 22:13
344 查看
学习一种技术我们先得了解下为什么要学习,它的优点是什么。 对于EventBus的话,我想作用大概有如下两点:代替
Thread+Handler的线程间通信方式和代替回调,EventBus主要用来做消息/事件的传递,可以代替传Intent,Handler,Broadcast或接口
函数在Fragment,Activity,Service,线程之间传递消息,开销更小,代码更加简洁易懂,其实主要作用是解耦,把本该有
联系的需要传引用的给简化了
1.EventBus的简单使用
(1)依赖
(2) Activity注册Event
(3)Post Event
(4) Handle Event
注解@Subscribe来定义subscriber的回调method,方法名可以任意定义
2.ThreadMode用法
使用ThreadMode主要是来指定handle event的方法所指向的线程,我们先来看看ThreadMode枚举里面的内容
默认的方式,Handle Event跟Post Event在用一个线程
(2)Main
当指定threadMode为Main时,handle event的线程运行在UI线程,如果post event的线程也运行在UI线程的话,
那么跟POSTING的效果是一样的,注意使用此模式,不要堵塞UI线程
(3)BACKGROUND
使用此模式,当Post Event的线程在子线程的话,那么Handle Event会在该线程中回调
如果Post Event运行在UI线程的话,那么Handle Event会开启一个后台线程去执行,按顺序
去分发所有事件
(4)ASYNC
当指定threadMode=Async时,handle event始终独立于UI线程和post event所在的线程,即:和post event不在同一线程,
也不在UI线程。此模式适合耗时任务:e.g.:网络链接。另外,EventBus使用线程池高效的使用线程
3.Sticky Events
当我们使用EventBus.getDefault().post(Object o)方式post event的话,必须先regist,然后Post Event,Handle Event才会起
作用,是当我们post event时,还没有subcriber怎么办?但是又想后注册的subscriber,能收到消息,这时sticky event就开始大
显身手了。
ActivityA中:
Activity中:
结果我就不打印了,注意的是需要在handle event方法的上面需要加上sticky=true
(1) sticky event remove,阻断继续传递。
4.优先级和切断消息的传递
EventBus的使用大概也就这儿多,下次带来EventBus3.0的源码解析吧
Thread+Handler的线程间通信方式和代替回调,EventBus主要用来做消息/事件的传递,可以代替传Intent,Handler,Broadcast或接口
函数在Fragment,Activity,Service,线程之间传递消息,开销更小,代码更加简洁易懂,其实主要作用是解耦,把本该有
联系的需要传引用的给简化了
1.EventBus的简单使用
(1)依赖
compile 'org.greenrobot:eventbus:3.0.0'
(2) Activity注册Event
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }
(3)Post Event
EventBus.getDefault().post("这是测试数据");所有已注册EventBus的subscriber只要event_type相匹配,都可以收到该event
(4) Handle Event
@Subscribe public void onMessageEvent(String message){ Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show(); }
注解@Subscribe来定义subscriber的回调method,方法名可以任意定义
2.ThreadMode用法
使用ThreadMode主要是来指定handle event的方法所指向的线程,我们先来看看ThreadMode枚举里面的内容
public enum ThreadMode { POSTING, MAIN, BACKGROUND, ASYNC; }(1)POSTING
默认的方式,Handle Event跟Post Event在用一个线程
@Subscribe(threadMode = ThreadMode.POSTING) public void handlerMessageEvent(MessageEvent event){ Log.i(TAG, "handlerMessageEvent: "+event.getMessage()); }
@Subscribe public void handlerMessageEvent(MessageEvent event){ Log.i(TAG, "handlerMessageEvent: "+event.getMessage()); }上面这两种方式的效果是一样的,都是指定handleMessageEvent方法运行的线程跟event post的线程是同一个
(2)Main
@Subscribe(threadMode = ThreadMode.MAIN) public void onMessage(MessageEvent event) { textField.setText(event.message); }
当指定threadMode为Main时,handle event的线程运行在UI线程,如果post event的线程也运行在UI线程的话,
那么跟POSTING的效果是一样的,注意使用此模式,不要堵塞UI线程
(3)BACKGROUND
@Subscribe(threadMode = ThreadMode.BACKGROUND) public void onMessage(MessageEvent event){ saveToDisk(event.message); }
使用此模式,当Post Event的线程在子线程的话,那么Handle Event会在该线程中回调
如果Post Event运行在UI线程的话,那么Handle Event会开启一个后台线程去执行,按顺序
去分发所有事件
(4)ASYNC
当指定threadMode=Async时,handle event始终独立于UI线程和post event所在的线程,即:和post event不在同一线程,
也不在UI线程。此模式适合耗时任务:e.g.:网络链接。另外,EventBus使用线程池高效的使用线程
3.Sticky Events
当我们使用EventBus.getDefault().post(Object o)方式post event的话,必须先regist,然后Post Event,Handle Event才会起
作用,是当我们post event时,还没有subcriber怎么办?但是又想后注册的subscriber,能收到消息,这时sticky event就开始大
显身手了。
ActivityA中:
public void postMessage(View view){ EventBus.getDefault().postSticky(new MessageEvent("这是测试的数据")); startActivity(new Intent(this,MainActivityB.class)); }
Activity中:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_b); tv_message= (TextView) findViewById(R.id.tv_message); EventBus.getDefault().register(this); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } @Subscribe(sticky = true,threadMode = ThreadMode.MAIN) public void handlerMesage(MessageEvent event){ tv_message.setText(event.getMessage()); }
结果我就不打印了,注意的是需要在handle event方法的上面需要加上sticky=true
(1) sticky event remove,阻断继续传递。
//返回的是之前的sticky event MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class); //Better check that an event was actually posted before if(stickyEvent != null) { //Now do something with it }
4.优先级和切断消息的传递
//priority默认为0,不同ThreadMode下的分发流程不受优先级的影响 //优先级高的可以优先获得消息 @Subscribe(priority = 1); public void onEvent(MessageEvent event) { … //不希望后续的subcriber收到消息,可以在收到消息后,调用cancelEventDelivery(Object event) 取消消息的后续传递。 EventBus.getDefault().cancelEventDelivery(event) ; }
EventBus的使用大概也就这儿多,下次带来EventBus3.0的源码解析吧
相关文章推荐
- EventBus 3.0 从入门到精通——使用详解(二)
- EventBus 3.0 使用详解
- EventBus 3.0使用详解
- EventBus 3.0 从入门到精通——使用详解(一)
- EventBus 3.0使用详解
- EventBus的使用详解(一)--初步使用EventBus
- EventBus使用详解(二)
- EventBus使用详解(二)——EventBus使用进阶
- 初次使用cocos2d 3.0 的box2d引擎详解
- EventBus使用详解(一)——初步使用EventBus
- EventBus使用详解(二)——EventBus使用进阶
- EventBus使用详解(二)——EventBus使用进阶
- EventBus使用详解(二)——EventBus使用进阶
- EventBus使用详解(二)—— EventBus使用进阶
- EventBus使用详解(二)——EventBus使用进阶
- Android-->EventBus 3.0新版使用说明(及其使用方法)
- EventBus使用详解(二)——EventBus使用进阶
- EventBus使用详解
- EventBus使用详解(二)——EventBus使用进阶
- EventBus使用详解(二)——EventBus使用进阶