初识EventBus

来源:互联网 发布:linux ip命令查看ip 编辑:程序博客网 时间:2024/06/18 13:34

听说EventBus是个好东西,然而我还没了解过。所以今天来学习归纳下~

EventBus定义是一个发布 / 订阅的事件总线,看描述感觉和观察者模式有点类似,但是他包含着4个部分:

          1.发布者 2.订阅者 3.事件 4.总线    

使用方法:注册和取消注册的方法与观察者模式一致,在onCreate方法里面register,在onDestory方法里面unregister即可。

    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //注册  类似于观察者模式        EventBus.getDefault().register(this);    }    @Override    public void onDestroy() {        super.onDestroy();        //取消注册        EventBus.getDefault().unregister(this);    }

然后,我们需要建立一个订阅者来订阅来订阅一个事件,订阅者的方法名必须要以onEvent开头。

这么做的原因时,当我们在onCreate方法中注册EventBus的时候,EventBus会扫描所有注册了EventBus的当前类,把以onEvent开头的方法,同过Map<方法的类型参数,方法>集合记录并保存下来。

    /**     * 如果方法名以onEvent开头,则代表要订阅一个事件,MainThread意思,这个方法最终要在UI线程执行;当事件发布的时候,这个方法就会被执行     * @param event     */    public void onEventMainThread(Event.ItemListEvent event)    {        setListAdapter(new ArrayAdapter<Item>(getActivity(),                android.R.layout.simple_list_item_activated_1,                android.R.id.text1, event.getItems()));    }

上面介绍的是订阅者订阅的事件,下来说下如何让发布者来发布事件消息。

              当需要发布消息时,我们可以调用EventBus.getDefault().post(事件类)  来post我们的事件,EventBus会根据post中实参的类型,去Map中查找对应的方法(前面存储的参数类型),于是找到了我们定义的onEventMainThread,最终调用反射去执行我们的方法。

    @Override    public void onListItemClick(ListView l, View v, int position, long id) {        super.onListItemClick(l, v, position, id);        //点击Item时发布一个事件        EventBus.getDefault().post(getListView().getItemAtPosition(position));    }


这就是EventBus运作的大致流程。当然 前面说到的以onEvent开头的方法名并不是乱起的,后面的 部分也是有含义的。它表示我们的事件讲运行在哪个线程里面。

   EventBus一共包含了4个线程类型供我们使用:

    用法也是非常简单,就是命名的时候规范下就行

     方法名为:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync

onEventMainThread代表这个方法会在UI线程执行,即主线程里面

onEventPostThread代表这个方法会在当前发布事件的线程执行

BackgroundThread这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用。

Async 加入后台任务队列,使用线程池调用,注意没有BackgroundThread中的一个接一个。

参考:鸿洋大神传送门http://blog.csdn.net/lmj623565791/article/details/40794879







0 0
原创粉丝点击