RXJava 2/RxAndroid 2 vs Observable vs Listener从不同类别观察
因为我想开始我的新应用程序与一个干净的基地,即时通讯寻找一个很好的方式共享围绕不同类别的信息。例如,我想订阅可能会被不同类别使用/共享的界面。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中包装一个接口吗?
该代码未经过测试,只是为了说明我的理解。任何帮助将不胜感激。
是的,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调用转换为其他的事情,而只是直接使用他们需要的地方。
谢谢。这只是一个例子;-)我知道它用于将新数据添加到流中,并通知订阅者,当然还会在收到所有数据时调用onComplete()。由于观察者或消费者是通用的,我可以填写任何我想要的数据(甚至是一个界面(!))。但这不是目标,因为我想分享不同类别的数据。由于PublishSubject被用作(观察者和观察者)(doc),这看起来很有前景。我有什么问题吗? ;-) –
所以每个想要接收数据的类都会实现消费者,他们都可以观察PublishSubject – Budius
听起来不错,谢谢。你可以提供一个样本并编辑你的答案吗?谢谢你到目前为止。 –