EventBus

發(fā)送事件的類不需要注冊和反注冊

要在下一個界面注冊并且在打開界面之后立馬發(fā)送消息將接受不到,原因是太快了還沒來得及注冊就發(fā)送了。

解決方法:使用postSticky粘性發(fā)送消息,即在注冊之前發(fā)送消息也能收到消息

并且在回調方法注解里面添加sticky =true

startActivity(new Intent(this,LoginActivity.class));
            OthersLogin event = new OthersLogin(true);
            LogUtil.showLog("eeee=publish","pppppppp");
            EventBus.getDefault().postSticky(event);
            finish();
            
  @Subscribe(threadMode = ThreadMode.POSTING,sticky =true)
//    @Subscribe(sticky =true)
public void onPostingEvent(OthersLogin event) {
    othersLogin=event.othersClick;
    
}

EventBus使用

開源地址:https://github.com/greenrobot/EventBus

使用步驟

1. 在Module的build.gradle添加依賴
compile 'org.greenrobot:eventbus:3.0.0'

2. 創(chuàng)建事件
public class MyEvent {
    public String msg;
    public MyEvent(String msg) {
        this.msg = msg;
    }
}


3. 注冊和反注冊EventBus
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //注冊事件總線
    EventBus.getDefault().register(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    //反注冊事件總線
    EventBus.getDefault().unregister(this);
}


4. 監(jiān)聽事件
/**
 * POSTING線程模型:在哪個線程發(fā)布事件,就在哪個線程執(zhí)行onPostingEvent方法
 */
@Subscribe(threadMode = ThreadMode.POSTING)
public void onPostingEvent(MyEvent event) {
    Log.d(TAG, "onPostingEvent: " + Thread.currentThread().getName());
}

/**
 * MAIN線程模型:不管是哪個線程發(fā)布事件,都在主線程執(zhí)行onMainEvent方法
 */
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMainEvent(MyEvent event) {
    Log.d(TAG, "onMainEvent: " + Thread.currentThread().getName());
}

/**
 * BACKGROUND線程模型:事件如果是在子線程發(fā)布,onBackgroundEvent方法就在該子線程執(zhí)行,事件如果是在
 * 主線程中發(fā)布,onBackgroundEvent方法就在EventBus內部的線程池中執(zhí)行
 */
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onBackgroundEvent(MyEvent event) {
    Log.d(TAG, "onBackgroundEvent: " + Thread.currentThread().getName());
}

/**
 * ASYNC線程模型:不管事件在哪個線程發(fā)布,onAsyncEvent方法都在EventBus內部的線程池中執(zhí)行
 */
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onAsyncEvent(MyEvent event) {
    Log.d(TAG, "onAsyncEvent: " + Thread.currentThread().getName());
}


5. 發(fā)布事件
/**
 * 在主線程中發(fā)布事件
 * @param view
 */
public void onPublishEventOnMainThread(View view) {
    MyEvent event = new MyEvent("msg from publisher main thread");
    EventBus.getDefault().post(event);
}

/**
 * 在子線程中發(fā)送事件
 * @param view
 */
public void onPublishEventOnBGThread(View view) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            MyEvent event = new MyEvent("msg from publisher bg thread");
            EventBus.getDefault().post(event);
        }
    }).start();
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容