我是一名有用的助手,可以翻译文本。
新手使用RxJava,对于接口回调(通过接口变量从代码内部/模块调用)和RxJava有疑问。 为了更清晰,举个例子: 标准回调接口实现,接口、A类和B类。
当调用classB方法"somethingHappened"时,结果为:"回调调用了方法somethingHappened"。可以从classB中调用接口的方法onCallbackCalled(String str) 任意次。
类A ↓ ............................................ 通过构造函数注入接口
类B................↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ onCallbackCalled(...) 0...n 次
现在是RxJava。我发现99%的情况都是如此。
Scheme是:
CLASS A ↓........................ 一次调用获取Observable资源
CLASS B................↑ EDIT 返回一个可发出0到n个值的observable 所以基本上你从顶层(在这个例子中)调用并得到内部层状态的响应。
问题:
1)假设您有一个正在动态更改(但不是任何类型的AsyncTask等)的模型(内部层),并且您想通知顶层(例如UI)状态已更改(很好的例子:游戏),该怎么做?
2)RxJava库中是否有任何类型的“桥接”类(我认为它是“订阅它,然后您可以多次传递参数给它,并且信息/observable将被发出到订阅者”)?
3)在尝试这样做而不是标准接口回调(在上述情况下,而不是“点击按钮,仅获取一次响应”)的情况下,是否有意义和优势?
更新,基于上述示例的答案
正如Bob Dalgleish所提到的那样,制作这样的桥梁的方法是使用扩展Subject<T> rxjava中的一个类。 http://reactivex.io/documentation/subject.html
下降趋势可能是,如果我们想要使用一个“桥接器”来处理多个回调类型(接口具有方法,我们仅使用一个方法:“onNext()”),我们可能需要创建带有回调参数的包装类。 在我看来,这不是大问题。
另一方面,我们可以访问所有RxJava运算符。 http://reactivex.io/documentation/operators.html (上面的示例适用于RxJava2,在其中Disposable基本上是RxJava1中的Subscription)。
新手使用RxJava,对于接口回调(通过接口变量从代码内部/模块调用)和RxJava有疑问。 为了更清晰,举个例子: 标准回调接口实现,接口、A类和B类。
interface CustomCallback {
void onCallbackCalled(String str);
}
class ClassA {
private ClassB classB;
public ClassA() {
classB = new ClassB(new CustomCallback() {
@Override
public void onCallbackCalled(String str) {
System.out.println("Callback called " + str);
}
});
}
}
class ClassB {
private CustomCallback customCallback;
public ClassB(CustomCallback callback) {
customCallback = callback;
}
private void somethingHappened() {
customCallback.onCallbackCalled("method somethingHappened");
}
}
当调用classB方法"somethingHappened"时,结果为:"回调调用了方法somethingHappened"。可以从classB中调用接口的方法onCallbackCalled(String str) 任意次。
类A ↓ ............................................ 通过构造函数注入接口
类B................↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ onCallbackCalled(...) 0...n 次
现在是RxJava。我发现99%的情况都是如此。
class ClassA {
private ClassB classB;
public ClassA() {
classB = new ClassB();
}
public void rxJavaMethod() {
DisposableObserver<String> observer = classB.getObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<String>() {
@Override
public void onNext(String s) {}
@Override
public void onError(Throwable e) {}
@Override
public void onComplete() {}
});
}
}
class ClassB {
private Observable<String> getObservable() {
return Observable.just(can be different from "just", for sake of example);
}
}
Scheme是:
CLASS A ↓........................ 一次调用获取Observable资源
CLASS B................↑ EDIT 返回一个可发出0到n个值的observable 所以基本上你从顶层(在这个例子中)调用并得到内部层状态的响应。
问题:
1)假设您有一个正在动态更改(但不是任何类型的AsyncTask等)的模型(内部层),并且您想通知顶层(例如UI)状态已更改(很好的例子:游戏),该怎么做?
2)RxJava库中是否有任何类型的“桥接”类(我认为它是“订阅它,然后您可以多次传递参数给它,并且信息/observable将被发出到订阅者”)?
3)在尝试这样做而不是标准接口回调(在上述情况下,而不是“点击按钮,仅获取一次响应”)的情况下,是否有意义和优势?
更新,基于上述示例的答案
正如Bob Dalgleish所提到的那样,制作这样的桥梁的方法是使用扩展Subject<T> rxjava中的一个类。 http://reactivex.io/documentation/subject.html
class ClassA {
private ClassB classB;
public ClassA() {
classB = new ClassB();
}
public void rxJavaMethod() {
DisposableObserver<String> observer = classB.getCallbackSubjectRx()
.subscribeWith(new DisposableObserver<String>() {
@Override
public void onNext(String s) {}
@Override
public void onError(Throwable e) {}
@Override
public void onComplete() {}
});
}
}
class ClassB {
private BehaviorSubject<String> mCallbackRx;
public ClassB() {
mCallbackRx = BehaviorSubject.create();
}
// method somethingHappened can be invoked whenever whe want and
// it will send given parameter to all subscribers
private void somethingHappened() {
mCallbackRx.onNext("method somethingHappened");
}
// multiple subscribers allowed
public BehaviorSubject<String> getCallbackSubjectRx() {
return mCallbackRx;
}
}
下降趋势可能是,如果我们想要使用一个“桥接器”来处理多个回调类型(接口具有方法,我们仅使用一个方法:“onNext()”),我们可能需要创建带有回调参数的包装类。 在我看来,这不是大问题。
另一方面,我们可以访问所有RxJava运算符。 http://reactivex.io/documentation/operators.html (上面的示例适用于RxJava2,在其中Disposable基本上是RxJava1中的Subscription)。