因爲我想開始我的新應用程序與一個乾淨的基地,即時通訊尋找一個很好的方式共享圍繞不同類別的信息。例如,我想訂閱可能會被不同類別使用/共享的界面。RXJava 2/RxAndroid 2 vs Observable vs Listener從不同類別觀察
實施例用於接口/可觀察的方法:
class SingleTonHolder {
private static _instance = null; // and initalize it using a static method.
private List<MyListener> myListeners new ArrayList<>();
public SingleTonHolder getInstance(){ return _instance }
public void registerListener(MyListener listener) { myListeners.add(listener); }
public void removeListener(MyListener listener) { myListeners.remove(listener); }
public void doSomethingToTheListener(...) { for(MyListener l : myListeners) l.doSomethingToTheListener(..); }
}
ClassOne extends MyListener {
public void onCreate() {
SingleTonHolder.getInstance().registerListener(this);
}
public vond onDestroy() {
SingleTonHolder.getInstance().removeListener(this);
}
}
和另一類偵聽變化。
ClassTwo {
MyListener listener = null;
public void onCreate() {
listener = new MyListener(() => { .... });
SingleTonHolder.getInstance().registerListener(listener);
}
public vond onDestroy() {
SingleTonHolder.getInstance().removeListener(listener);
}
}
這樣做的工作,看起來像默認的解決方案。每次另一個對象調用SingleTonHolder.doSomethingToTheListener()時,它都會通知所有已註冊的偵聽器進行更改。
因爲我想嘗試使用RxJava2和RxAndroid2缺乏文檔相同的解決方案,我嘗試了下面的方式做它。
Class CallFactory{
public Obvservable<List<Data>> getDummyData() { return anDummyObservable; }
}
然後IVE創建一個單獨的類,其具有的功能來修改/ OBSERV onec客戶端訂閱。
public Observable<List<Data>> getData() {
return CallFactory.with(context)
.getDummyData(...)
.map(modifyList -> { /** do some processing **/return modifyList;
})
}
爲例外,因爲每一次客戶端訂閱其「召回」,並在客戶端保持連接直到onCompleted(),它不工作時調用。
我第一次嘗試共享信息給所有訂閱的客戶端,我在我的Singleton類中創建了PublishSubject。
private PublishSubject<List<Data>> sharedSubject = PublishSubject.create();
現在,我讓我的客戶使用的方法類似
public PublishSubject getSharedSubject() { return this.sharedSubject; }
訂閱對象。如果我想發應該由所有的監聽客戶端接收的話,我已經創建了類似
消息public void setNewData(List<Data> data) {
sharedSubject.onNext(data);
}
我很確定這不是它應該的方式,而是rxjava旨在提供這樣的解決方案嗎?如果我想共享不同的onNext事件,onError,onComplete,我需要在onNext中包裝一個接口嗎?
該代碼未經過測試,只是爲了說明我的理解。任何幫助將不勝感激。
謝謝。這只是一個例子;-)我知道它用於將新數據添加到流中,並通知訂閱者,當然還會在收到所有數據時調用onComplete()。由於觀察者或消費者是通用的,我可以填寫任何我想要的數據(甚至是一個界面(!))。但這不是目標,因爲我想分享不同類別的數據。由於PublishSubject被用作(觀察者和觀察者)(doc),這看起來很有前景。我有什麼問題嗎? ;-) –
所以每個想要接收數據的類都會實現消費者,他們都可以觀察PublishSubject – Budius
聽起來不錯,謝謝。你可以提供一個樣本並編輯你的答案嗎?謝謝你到目前爲止。 –