2017-04-12 24 views
0

好的,所以我是RxJava2的新手(呃,我也不知道RxJava),並且正在嘗試使用RxJava2和MVP結構開發Android應用程序。RxJava和長時間運行的監聽器

在該應用程序中,我正在對使用偵聽器的庫進行異步調用。 我使用「標準」setListener/registerListener方法設置偵聽器。

其中一種方法是返回值「realtime」 - >我調用我的庫的start()方法,然後在列表的每次修改時都會通知我的監聽器(當出現添加/刪除這幾項)。

我真的不知道如何使用RxJava來實現這種行爲,因爲監聽器是在發射器/訂戶的定義中訂閱的? 我應該在哪裏聲明聽衆?我應該在哪裏取消訂閱?我應該使用什麼對象?

我開始使用Nucleus開發,但可以切換到另一個樣板或自己做一個。

這是說明我的問題的一些僞代碼:

以前

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 

    mMyLib.setListener(this); 
    mMyLib.startDiscovery(); 
} 

@Override 
public void itemListChanged(List<Dummy> items) { 
    // update the UI with the list items 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mMyLib.setListener(null); 
} 

使用核,在我的演講

我應該在哪裏退訂,如果我想收到只要我的活動/演示者活着,就可以修改列表?我甚至使用正確的語法/對象?

private static final int REQUEST_ITEMS = 1; 
private PublishSubject<Integer> pageRequests = PublishSubject.create(); 

... 

@Override 
public void onCreate(Bundle savedState) { 
    super.onCreate(savedState); 

    restartableReplay(REQUEST_ITEMS, 
      () -> Observable.create(e -> 
        { 
         mMyLib.setListener(new MyLib.Listener() { 
          @Override 
          public void itemListChanged(List<Dummy> items) { 
           Log.d(TAG, "meh itemListChanged"); 
           e.onNext(items); 
           e.onComplete(); 
          } 
         }); 
         mMyLib.startDiscovery(); 
        } 
      ) 
      , 
      MainFragment::onItems, 
      MainFragment::onNetworkError); 
} 

void request() { 
    start(REQUEST_ITEMS); 
} 

回答

1

你是在正確的方向,這是包裝與RxJava異步回調,少數意見的有效方法:

  • 傻冒呼籲e.onComplete()itemListChanged,這是錯誤的,因爲它會結束您的Observable序列,因此您可能完全不需要撥打onComplete(),因爲它永遠不會從外部來源結束通知,或者在通知實際結束時調用一次(外部來源完成以生成項目),請不要混淆它取消訂閱來源。
  • 對於退訂邏輯做一些事情,你應該在你的create()定義它,叫e.setCancellable()與取消邏輯(mMyLib.setListener(null)或任何額外清理資源代碼)
  • 它似乎在這種情況下,你只有1個訂閱者,但在其他方面考慮使用share(),以具有可以多播到多個訂戶的'熱門'Observable
  • 爲核心庫,據我記得restartableReplay,將緩存傻冒Observable重播發射項目,這可能是錯誤的這種事件的「熱」流(除非你需要也許重播最後一次發射或其​​他),另外,緩存將會有問題,因爲你將失去取消訂閱的能力,所以只要確保在這裏使用Nucleus。

如果我想只要接收名單的修改我的活動/演示者還活着應該在哪裏我退訂?我甚至使用正確的語法/對象?

你只需要退訂,無論你想停止的通知,無論是在onStop()onDestory()取決於是你。

+0

不錯的答案,謝謝:) 你認爲我最好擺脫Nucleus,並實施自己的「自己的MVP」(我發現了很多鍋爐板周圍)? 我會盡快編輯我的問題並提出修正建議。 – w00ly

+0

好吧,我對Nucleus不太熟悉,它可能對MVP的使用有好處,只是當你使用它的重連功能來處理你的案例中的活動/片段功能 – yosriz