EventBus开发精要

http://blog.csdn.net/lmj623565791/article/details/40794879
讲解的清晰

一共就使用EventBus的3个API
EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().post(object);//发布事件
EventBus.getDefault().unregister(this);//取消订阅
核心原理
EventBus.getDefault().register(this);

这行代码表示让EventBus扫描当前类, 把所有onEvent开头的方法记录下来,例如这样的方法名:

public class ItemListFragment extends ListFragment
{

    public void onEventMainThread(ItemListEvent event) {
        doSomething();
    }
}

如何记录呢?在EventBus内部使用一个Map对象,其中Key为方法中参数的类型,Value的值包含了我们的方法名。

Map<Object, List<Class<?>>> typesBySubscriber;

value实际是一个List, 一个作为参数类型的key, 对应着一个List<方法名>的value, 这个List中每个item代表着一个方法名信息.
在上面这个例子中, ItemListEvent类型名字作为key,
ItemListFragment::onEventMainThread()方法名就被add到作为value的List<方法名>中.

    EventBus.getDefault().register(mEventSubscriber);
    private EventSubscriber mEventSubscriber = new EventSubscriber();

    private class EventSubscriber {
        public void onEventBackgroundThread(SaveSkinEvent event) {
            onEventBackgroundThreadImpl(event);
        }
    }

则是让EventBus扫描mEventSubscriber这个对象, 把它这个类中以onEvent开头的方法记录下来.
当代码执行到

EventBus.getDefault().post(object);

EventBus就以object的类型作为key, 在它的Map中查到对应的List<方法名>,用反射的方式依次调用list中的所有方法.

EventBus的ThreadMode

EventBus包含4个ThreadMode:PostThread,MainThread,BackgroundThread,Async.
MainThread mode我们已经不陌生了, 这个模式用的最多.
具体的用法,极其简单,方法名为:
onEventPostThread, onEventMainThread,
onEventBackgroundThread,onEventAsync即可
具体什么区别呢?
onEventMainThread代表这个方法会在UI线程执行
onEventPostThread代表这个方法会在发布事件所在的线程中执行
BackgroundThread这个方法,如果在非UI线程发布的事件,则直接在发布事件所在的线程中去执行。如果在UI线程发布的事件,则加入到EventBus的一个后台任务队列,使用线程池一个接一个的调用执行。
Async代表这个方法被加入到后台任务队列,使用线程池调用.

项目实践

在browser代码里, BrowserEvents.java里定义了几十个内部类, 用于代表不同的事件,使用EventBus实现了各功能模块的解藕.
以字体更新为例,
ChromeTabbedActivity里定义一个BroadcastReceiver用以接受奇酷OS发出的字体改变事件.

    private BroadcastReceiver mUpdateFontReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            updateFontSize();
        }
    };
    private void updateFontSize() {
            QEventBus.getEventBus().post(new BrowserEvents.updateNavViewFont());//发布事件
        }
    }
public class BrowserEvents {
    public static class updateNavViewFont {
        public updateNavViewFont() {
        }
    }
}

在NewsPageView, VideoPageView里都以BrowserEvents.updateNavViewFont作为参数类型的方法, 其方法名信息作为value值, 被添加到EventBus中的Map中.

public class NewsPageView {
    public void onEventMainThreadImpl(BrowserEvents.updateNavViewFont event) {
        updateNewsList();
    }
}

当ChromeTabbedActivity发布BrowserEvents.updateNavViewFont事件后,
NewsPageView
和VideoPageView中的onEventMainThreadImpl(BrowserEvents.updateNavViewFont event)
依次被调用, 再通过调用updateNewsList();实现了在listView中的字体更新.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,120评论 19 139
  • 文章基于EventBus 3.0讲解。首先对于EventBus的使用上,大多数人还是比较熟悉的。如果你还每次烦于使...
    Hohohong阅读 6,887评论 0 6
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,885评论 0 9
  • 1.人们内心恐惧,才是我们这一生最大的敌人,而并不是那些外在打击我们、伤害我们的人、事、物。——眭澔平《我看到的世...
    颜梦sky阅读 2,675评论 0 1
  • 北京时间8:38,终于在发车的前一刻赶上了那一趟5026的硬座,今天月圆,车上人不多,选定靠窗座位,便如老翁入定一...
    乔小逸阅读 1,787评论 0 0

友情链接更多精彩内容