Это мой первый опыт разработки в мире реактивной парадигмы, и я начал использовать rxjava2 / rxandroid2, поскольку, судя по видео, которые я смотрел, и статьям, которые я читал, кажется, что лучше начать с 2, поскольку в 1 так много изменений, что отличается от библиотеки в большом масштабе, но теперь у меня возникли проблемы с поиском чего-то, что действует как
unsubscribe()
метод бывшей библиотеки rxjava / rxandroid
моя цель довольно проста
- выполнить вызов API (сетевая операция)
- слушайте и реагируйте на то, что излучает наблюдаемое (счастливый путь)
- не слушайте и не реагируйте, когда приложение переходит в состояние ПАУЗА
- или отказаться от подписки на наблюдаемое, как только Android перейдет в жизненный цикл паузы
, исходя из имеющихся ресурсов
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 очень крутая кривая обучения.
Любая помощь будет оценена.