Rxjava2/RxAndroid2,处置(寻找 rx1 退订的等价物)
Rxjava2/RxAndroid2, dispose (looking for an equivalent for rx1 unsubsribe)
这是我第一次在响应式范式世界中开发,我开始使用 rxjava2/rxandroid2,根据我看过的视频和我读过的文章,似乎从 2 开始更好因为 1 有很多变化,在很大程度上与图书馆不同,但现在我在寻找像
这样的东西时遇到了一些麻烦
unsubscribe()
前rxjava/rxandroid库的方法
我的目标很简单
- 执行API呼叫(网络操作)
- 倾听 Observable 将发出的内容并做出反应(快乐之路)
- 当应用程序进入暂停状态时不收听或做出反应
- 或者,一旦 android 进入暂停生命周期
就取消订阅 observable
,根据身边的资源有
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 都不会被调用,但这似乎不起作用,我在这里遗漏了什么吗?或者有一些我完全不明白的东西,我对我的代码的想法是,
"what if onNext is performing something towards a widget(UI)(Observer) and the app goes on pause state?",我不希望那个 UI(观察者)再对那个特定的 UI 做出反应。
很多人是对的,我承认,转向响应式编程非常困难,尤其是 rxjava2/rxandroid2 的学习曲线非常陡峭。
任何帮助将不胜感激。
你对 Observer
和 Disposable
的处理不正确,Disposable
对象应该由 Observable 交给你,你不能自己创建它,并用它显式调用 Observer.onSubscribe()
,因为它没有连接到 Observable
并且不会终止它。
(您还可以注意到 Observer.onSubscribe
被调用了两次,一次被 Observable
调用,一次被您调用)
你应该做的,只是在你的 Observer
中使用 onSubscribe(Disposable d)
方法来保存 Disposable
,它会被 Observable
自动调用并将给你正确的 Disposable 对象,你可以用它成功地终止网络操作。
另一种选择是,根本不使用 subscribe(Observer o) method, but other overloads that takes your onNext/onError/onCompleted 作为参数,以及 returns Disposable
对象,你可以用它来处理(unsusbcribe),以终止网络称呼。
这是我第一次在响应式范式世界中开发,我开始使用 rxjava2/rxandroid2,根据我看过的视频和我读过的文章,似乎从 2 开始更好因为 1 有很多变化,在很大程度上与图书馆不同,但现在我在寻找像
这样的东西时遇到了一些麻烦 unsubscribe()
前rxjava/rxandroid库的方法
我的目标很简单
- 执行API呼叫(网络操作)
- 倾听 Observable 将发出的内容并做出反应(快乐之路)
- 当应用程序进入暂停状态时不收听或做出反应
- 或者,一旦 android 进入暂停生命周期 就取消订阅 observable
,根据身边的资源有
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 都不会被调用,但这似乎不起作用,我在这里遗漏了什么吗?或者有一些我完全不明白的东西,我对我的代码的想法是,
"what if onNext is performing something towards a widget(UI)(Observer) and the app goes on pause state?",我不希望那个 UI(观察者)再对那个特定的 UI 做出反应。
很多人是对的,我承认,转向响应式编程非常困难,尤其是 rxjava2/rxandroid2 的学习曲线非常陡峭。
任何帮助将不胜感激。
你对 Observer
和 Disposable
的处理不正确,Disposable
对象应该由 Observable 交给你,你不能自己创建它,并用它显式调用 Observer.onSubscribe()
,因为它没有连接到 Observable
并且不会终止它。
(您还可以注意到 Observer.onSubscribe
被调用了两次,一次被 Observable
调用,一次被您调用)
你应该做的,只是在你的 Observer
中使用 onSubscribe(Disposable d)
方法来保存 Disposable
,它会被 Observable
自动调用并将给你正确的 Disposable 对象,你可以用它成功地终止网络操作。
另一种选择是,根本不使用 subscribe(Observer o) method, but other overloads that takes your onNext/onError/onCompleted 作为参数,以及 returns Disposable
对象,你可以用它来处理(unsusbcribe),以终止网络称呼。