资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

EventBus-再也不用什么Handler了-创新互联

我在实际项目中使用EventBus经验总结:

创新互联公司凭借专业的设计团队扎实的技术支持、优质高效的服务意识和丰厚的资源优势,提供专业的网站策划、成都网站设计、做网站、网站优化、软件开发、网站改版等服务,在成都十载的网站建设设计经验,为成都千余家中小型企业策划设计了网站。

 刚开始听到EventBus的时候,觉得好像比较高大上,没有学过,不敢用。但是还是情不自禁的用到了项目当中。但是随着EventBus使用的地方越多,问题就出现了,就像见了鬼一样。

 问题1

 》描述:比如在Activity里有2个或多个Fragment,在两个Fragment里都会在子线程中发布

     MessageEvent在UI线程里吐司。但是问题来了,在FragmentA里我会请求网络,然后我又到了

     FragmentB中,竟然会接受到了FragmentA里的消息事件。

 》原因分析:既然在Fragment里可以接受到FragmentA的消息,说明FragmentA没有unRegist事件。

     原因是我照搬网上的代码,在onCreate里订阅事件,在onDestroy里unRegist事件。

       但实际上从FragmentA切换到FragmentB的时候,FragmentA是没有走onDestroy方法的。

 》解析方案:于是我决定在onStart与onStop方法里来走regist与unRegist方法。

      虽然这个问题解决了,但是新的问题又来了。FragmentA里的吐司事件又接收不到了,

      原因是FragmentA里的事件是在onActivityCreated方法里执行的,而这个生命周期的方

      法又是在onStart之前执行的。所以当请求网络回调发布事件的时候,还没有订阅事件。

 于是乎,我做了一个双重保险:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    EventBus.getDefault().register(this);
}

@Override
public void onStart() {
    super.onStart();
    if(!EventBus.getDefault().isRegistered(this)){
        EventBus.getDefault().register(this);
    }
}

@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    ButterKnife.reset(this);
    if(EventBus.getDefault().isRegistered(this)){
        EventBus.getDefault().unregister(this);
    }
}

 问题2

 搞开发就是这样,问题问题层出不穷。

 》描述:进入登录Fragment,没有点击登录按钮就退出了。竟然还解析了登录,并且登录的吐司竟然弹在了主页上。

 》原因分析:最开始,打的bug竟然没有走,后来又走了,才找到原因。事件定义重复了,主页在

      onResume里请求网络会发布一个事件,因为事件的int类型与登录Fragment里订阅的登录

     解析事件的int型相重复。但是即使是这样,登录Fragment关闭了不可能接收到主页的事

       件啊。主要原因还是因为登录Fragment的onDestroy方法有延迟,登录Fragment虽然不

      见了,但是触发了主页Fragment的onResume事件,登录Fragment没有来得及取消订阅就

      接受到了主页Fragment的登录解析事件,然后又把吐司给主页Fragment了。

 》解决方案:只要将冲突的事件int类型值改一下就行了。

 综上所述,EventBus订阅与取消订阅要及时准确(对所在类的生命周期把握准确),事件的定义(不同事件一定要有唯一标识),另外还有一点,事件类容易越写越多,要注意重构抽取。

  1. EventBus概论

 EventBus是Google Guava库里的一个类,用来进行消息传递,线程之间通讯。

2.EventBus的使用

 首先必须要入库

 onCreate()  注册EventBus   EventBus.register(Object ),注册的对象决定发布事件的参数

   所在方法的反射范围,一般用this,表示扫描当前类中所有的方法。

 onDestroy()  注销EventBus  EventBus.unRegister(Object)

 发布事件:EventBus.post(参数)  参数可以是任何类型,一般为实体类。

  一般在子线程中发布获得的数据,然后通过在主线程中的方法来接收参数,并更新UI。

 注意:处理事件的方法一定要加上@Subscribe注解

3.EventBus的底层

 EventBus的底层是用反射、集合Map技术。具体请看源码。

资料拓展:http://blog.csdn.net/lmj623565791/article/details/40794879

[转]EventBus使用详解(二)——EventBus使用进阶

http://m.blog.csdn.net/blog/u013173289/43970023

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享名称:EventBus-再也不用什么Handler了-创新互联
链接分享:http://www.cdkjz.cn/article/gcgoj.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220