使用EventBus的黏性事件遇到的一些问题,跟大家分享以下

    最近在做项目需求的时候,有一个功能是消息箱,其中有一个是这样的需求,大概描述如下:

    比如app接收到某三方推送后要在相应的界面上做出修改UI的动作,问题来了;这些界面有可能是当前界面或者还未启动的界面,然后最近在看EventBus的资料,就想起使用EventBus来实现,根据如上所述,想起了使用EventBus的黏性事件来实现。来说起来咱们就干,啪啪啪,一段逻辑写写写,好了,逻辑写完。跑起来试试看效果;


    1.在onStart()方法注册订阅者,onStop()方法注销订阅者;然后收到事件修改UI;

       比如在界面A可以正常接收到事件a,发现也修改了UI,问题来了,A界面跳到B界面后,然后返回到A界面又收到事件a,不对啊我就发送了一次,问题出现咱们就解决,然后去找发送的地方,找到了某推送app接收类看到,自己在某三方推送的透传和通知栏都做了接收处理。好吧这是自己做的梗,去看了下某三方推送文档,进行了对比去掉了透传的接收,改为通知栏到达才处理。然后继续跑起来看看,我插,居然还有问题,这是什么梗。一切从自己身上找毛病,肯定是自己的梗。看了看发现onStart()这小可爱在打开A时候注册了一次,然后A界面跳到B界面后回来,他又调用了onStart()方法,我插你这个梗,好吧,把EventBus注册放到oncreate()方法中去处理,对应的把注销事件放在onDestroy()。跑起来试试,发现第一次事件接收到,UI没变化,这特么是什么梗,去修改UI的地方看看,我插view是null的,我干,这么神速我干,简单的说就是在接收到事件的时候,界面还没走到view存在并可见;想想注册放哪里好呢?是不是应该放在view可见并非空,然后就想起来了一个类似情形,你们是否在onCreate()方法去获取view的宽高,然后获取到的值是0呢,是不是觉得很奇怪,好吧,这个问题也大概是这个情况;归结起来就是说咱们在UI非空且大小固定后,才去注册那不就好了是吧。解决方案如下:


跑起来发现问题还是没解决,出现的现象是还是会接收到两次事件,然后就去看下addOnGloablLayoutListener方法的源码,发现了解决办法,最终解决办法如下:


到此问题就解决了;

总结:使用黏性事件要是涉及到修改UI的就按如上处理下,意图:1.注册EventBus的时机要恰当  2.不能多次注册。(注册一次就会接收一次事件哟),希望能帮助到踩坑的同学。

你可能感兴趣的:(开发中遇到的那些问题和那些坑)