首頁  >  問答  >  主體

java - EventBus在普通对象里如何调用unregister()?

场景:在Android里,有一个Adapter,Activity里用Eventbus来post数据到这个adapter里。

问题:我可以在Adapter的构造方法里调用register()方法:

public BroadcastAdapter(Context context) {
    mContext = context;
    EventBus.getDefault().register(this);
    Log.d(TAG, "constructor");
}

但我要在哪里调用EventBus.getDefault().unregister(this)呢?

PHPzPHPz2764 天前552

全部回覆(1)我來回復

  • 怪我咯

    怪我咯2017-04-18 09:51:23

    在ListView對應的ListAdapter中是沒辦法直接感知ListView的狀態,在RecyclerView.Adapter中有一對方法public void onAttachedToRecyclerView(RecyclerView recyclerView)public void onDetachedFromRecyclerView(RecyclerView recyclerView)可以實現你的需求。
    但是我的建議是在建構BroadcastAdapter的地方(一般是Activity或Fragment)註冊及反註冊Event Handler。

    補充回答

    依照樓主的意思,是想把BroadcastAdapter裡面的EventBus相關的東西完全封裝在裡面,不應該讓外部感知到EventBus的存在,因為這完全是BroadcastAdapter的東西,與BroadcastAdapter的使用者無關,即解耦
    首先,EventBus的register和unregister是在什麼時候呼叫合適?我的答案是在你需要及不需要的事件處理的時候(廢話..),一般我們所常用的地方就是onCreate、onDestory(或onResume、onPause),在樓主的案例中應該是BroadcastAdapter使用及未使用的時候
    現在我假設樓主的Adapter是繼承的RecyclerView.Adapter,之前提到的public void onAttachedToRecyclerView(RecyclerView recyclerView)public void onDetachedFromRecyclerView(RecyclerView recyclerView)是在Adapter关联及取消关联RecyclerView的时候会回调的方法。一个Adapter正在是赋给了RecyclerView才算做一个有用的Adapter,所以我觉得onAttachedToRecyclerViewonDetachedFromRecyclerView正对应的BroadcastAdapter使用及未使用的时候。但是,有一个问题,我看了下Android的源码,onDetachedFromRecyclerView只是在更换其它Adapter的时候会调用,所以你应该在不使用RecyclerView的时候setAdapter(null)是在Adapter關聯及取消關聯RecyclerView的時候會回調的方法。一個Adapter正在是賦給了RecyclerView才算做一個有用的Adapter,所以我覺得onAttachedToRecyclerViewonDetachedFromRecyclerView正對應的

    BroadcastAdapter使用及未使用的時候
    。但是,有一個問題,我看了下Android的源碼,onDetachedFromRecyclerView只是在更換其它Adapter的時候會調用,所以你應該在不使用RecyclerView的時候setAdapter(null)

    ActivityFragment 其實說了這麼多,都不是我想給的答案- -|||,我認為樓主的設計有所不足。一個Adapter應該認認真真地做好它的本職工作(資料與View的適配),一個自訂View也應該安安靜靜地去顯示好它的視圖。我的設計方案是把事件處理放在,在事件處理時需要更新視圖的時候(有時候事件處理不僅需要更新視圖,可能也需要更新資料之類的,這樣放在View及Adapter裡明顯不合適),View給一些能更新視圖的介面出來。這樣Activity負責事件的處理,處於一種Controller的角色,而View簡簡單單的負責它的視圖,我覺得這才是解耦。物件導向設計原則中有一條就是

    單一職責原則🎜。 🎜

    回覆
    0
  • 取消回覆