Android EventBus接收不到事件(EventBus在Activity與fragment中註冊註銷位置)

       碰到了EventBus發送的事件接收不到的狀況,調試後發現是已經被註銷的問題。java

       首先註冊和註銷應該在向Activity生命週期中相對應的位置,由於Activity生命週期就是相對應的調用的,如onCreate和onDestory,onStart和onStop,onResume和onPause,若是調用到了onStop,下次出現就會從onStart開始。因此在註冊後要在其相對的生命週期進行註銷。ide

        不建議在onResume中,由於onResume出現的頻率大,因此要重複調用(針對重複調用的狀況,調用註冊前必定判斷還未註冊再去註冊,無論在哪一個生命週期都會更穩妥一點)。並且有時候Activity被異常回收,沒有調用onPause方法,這樣會致使EventBus沒有註銷。this

@Override
    protected void onStart() {
        super.onStart();
        if(!EventBus.getDefault().isRegistered(this)){
            //註冊
            EventBus.getDefault().register(this);
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (EventBus.getDefault().isRegistered(this)){
            //註銷
            EventBus.getDefault().unregister(this);
        }
    }

            官方推薦的是在onStart中註冊,在onStop註銷,說明這樣作更好,在Activity中這樣作目前還沒遇到問題,由於從一個Activity中跳轉到另外一個Activity中前一個Activity會調用到onPause,並不會調用onStop,因此不會被註銷,EventBus依然能夠正常接收。調試

            可是今天放在fragment中的時候出現接收不到問題,並非Activity異常回收,而是必現狀況,是在Fragment+ViewPager的主頁面應用場景下,在主頁面的某一Fragment中onStart中註冊EventBus,在onStop註銷。在Fragment中跳轉到另外一個Activity中。這時候主頁面的Activity會onStop,因此裏面的Fragment也都會onStop,因此EventBus被註銷了,也就接收不到事件了。code

           像這種跳轉後會onStop的狀況就是在onCreate中去註冊,在onDestory中去註銷。生命週期

相關文章
相關標籤/搜索