因为我想用干净的基础开始我的新应用程序,我正在寻找一种分享不同类别的信息的好方法。举个例子,我想订阅一个可以被不同类使用/共享的接口。
接口/ Observable方式的示例:
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);
}
}
这确实有效,看起来像是默认解决方案。每次另一个Object调用SingleTonHolder.doSomethingToTheListener()时,它会通知所有已注册的侦听器进行更改。
由于我想尝试使用缺少文档的RxJava2和RxAndroid2的相同解决方案,我尝试了以下方式。
Class CallFactory{
public Obvservable<List<Data>> getDummyData() { return anDummyObservable; }
}
然后我创建了一个Singleton类,它具有修改/ observ客户端订阅的功能。
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中包装一个接口?
代码未经过测试,只是为了表明我对它的理解。任何帮助都会很感激。
答案 0 :(得分:2)
是的,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调用包装到其他内容中,只需在需要的地方直接使用它们。