2017-02-20 83 views
2

因爲我想開始我的新應用程序與一個乾淨的基地,即時通訊尋找一個很好的方式共享圍繞不同類別的信息。例如,我想訂閱可能會被不同類別使用/共享的界面。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中包裝一個接口嗎?

該代碼未經過測試,只是爲了說明我的理解。任何幫助將不勝感激。

回答

1

是的,RxJava使用了這3個基本抽象回調onNext<T>onComplete()onError()

但我相信你錯過的重要部分是觀察者和消費者是一個接口的通用抽象。這意味着你只會有3個回調,但是你會有3個回調每個數據類型。

RxJava的主要思想是創建數據流。這意味着您將擁有一個PublishSubject<List<Data>>,一個PublishSubject<Foo>,一個PublishSubject<Bar>等,然後使用兩個接口之一Observer<T>Consumer<T>。沒有必要創建另一個接口或將其包裝在其他東西中。只需使用RxJava提供的那些,並將所需的所有信息放入數據中即可。

我希望它有幫助。

例子:

// first class 
public static class Foo implements Consumer<Data> { 
    Disposable d; 
    public Foo() { 
     this.d = SingleTonClass.subject.subscribe(this); 
    } 

    @Override void accept(Data data) { 
     .. here the original data 
    } 

} 

// second class 
public static class Bar implements Consumer<MappedData> { 
    Disposable d; 
    public Foo() { 
     this.d = SingleTonClass.subject 
      .map(some data transform ) 
      .subscribe(this); 
    } 

    @Override void accept(MappedData data) { 
     .. here the data after the map 
    } 


} 



class SingleTonClass { 
    public static PublishSubject<Data> subject = PublishSubject.create(); 

    // then feel free to fire events in the subject: 
    public static void onSomethingHappen(){ 
     subject.onNext(new Data(1)); 
    } 

    public static void onOtherThingHappen(){ 
     subject.onNext(new Data(2)); 
    } 
} 

一切的一切,我也不會換行的Rx調用轉換爲其他的事情,而只是直接使用他們需要的地方。

+0

謝謝。這只是一個例子;-)我知道它用於將新數據添加到流中,並通知訂閱者,當然還會在收到所有數據時調用onComplete()。由於觀察者或消費者是通用的,我可以填寫任何我想要的數據(甚至是一個界面(!))。但這不是目標,因爲我想分享不同類別的數據。由於PublishSubject被用作(觀察者和觀察者)(doc),這看起來很有前景。我有什麼問題嗎? ;-) –

+0

所以每個想要接收數據的類都會實現消費者,他們都可以觀察PublishSubject – Budius

+0

聽起來不錯,謝謝。你可以提供一個樣本並編輯你的答案嗎?謝謝你到目前爲止。 –