这是我第一次在反应范式世界中开发,我开始使用rxjava2 / rxandroid2,基于我观看过的视频和我读过的文章,似乎从2开始就更好了1许多变化使图书馆大规模地不同,但现在我在寻找像
这样的东西时遇到了一些麻烦 unsubscribe()
以前的rxjava / rxandroid库的方法
我的目标很简单
,基于周围的资源
dispose()
rx2的方法,我对此的理解是它处理任何当前资源(在我的情况下,基于我所理解的,调用它将使可观察的自身分离给任何观察者)。
但这似乎不是我所期待的,请看一下ff代码:
public class MainActivity extends AppCompatActivity {
final Disposable disposable = new Disposable() {
@Override
public void dispose() {
Log.e("Disposed", "_ dispose called.");
}
@Override
public boolean isDisposed() {
return true;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Observer<Object> observer = new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
Log.e("OnSubscribe", "On Subscribed Called");
}
@Override
public void onNext(Object value) {
Log.e("onNext", "Actual Value (On Next Called).");
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
Log.e("OnComplete", "On Complete Called.");
}
};
EventsApiService.getInstance().testApi().testCall()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnDispose(new Action() {
@Override
public void run() throws Exception {
Log.e("Disposed?", "__ Dispose");
}
})
.subscribe(observer);
observer.onSubscribe(disposable);
}
@Override
public void onPause() {
super.onPause();
disposable.dispose();
}
}
我有这个输出:
03-23 09:08:05.979 3938-3938/edu.rx.study E/Disposed: _ dispose called.
03-23 09:08:13.544 3938-3938/edu.rx.study E/onNext: Actual Value (On Next Called).
03-23 09:08:13.544 3938-3938/edu.rx.study E/OnComplete: On Complete Called.
我当时期待onNext不再被调用,或者可能同时调用onNext和onComplete,但这似乎不起作用,我在这里错过了什么?或者我完全不理解的东西,我对我的代码的思考是,
“如果onNext正在对窗口小部件(UI)执行某些操作(Observer)并且应用程序继续暂停状态?”,我不希望该UI(Observer)对该特定UI做出反应了。
很多人都是对的,我承认,转换到反应式编程非常困难,尤其是rxjava2 / rxandroid2的学习曲线非常陡峭。
任何帮助将不胜感激。
答案 0 :(得分:6)
您正在错误地处理Observer
和Disposable
,Disposable
对象应由Observable发送给您,您不能自己创建它,并且调用明确地Observer.onSubscribe()
使用它,因为它没有连接到Observable
并且不会终止它。
(您还可以注意到Observer.onSubscribe
被调用了两次,一个被Observable
调用,一个被你调用了
您应该做什么,只需使用onSubscribe(Disposable d)
上的Observer
方法保存Disposable
,Observable
会自动调用Disposable
并将您发送给我正确的Disposable对象,您可以使用它成功终止网络操作。
另一种选择是,不要使用subscribe(Observer o)方法,而是将onNext / onError / onCompleted作为参数的其他重载,并返回{{ 1}}对象,您可以使用它来处理(取消订阅),以终止网络呼叫。