Android, RxJava, AsyncTask и поворот экрана — как собрать все вместе?

Здравствуйте!

Есть главное активити с загрузкой фрагмента. Фрагмент самодостаточен и в активити не передает данные. Во фрагменте реализован простейший AsyncTask с перебором массива и вывода прогресса текущей операции в окно диалога (в TextView выводим элемент массива, в ProgressBar - его номер).

Возможно ли в принципе, без танцев с бубном и кучей кода, перевести код AsyncTask на RxJava да так, чтобы корректно обрабатывался и поворот экрана устройства?
Где можно найти рабочий пример, как это можно организовать?

Читал это
stackoverflow.com/questions/33980194/asynctask-in-...
и это ru.stackoverflow.com/questions/486838/alertdialog-...
и тут ru.stackoverflow.com/questions/470393/asynctask-%D...

Близко, но не то.
  • Вопрос задан
  • 1554 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
В RxJava есть механизмы для этого, например cache();
Observable<Photo> request = service.getUserPhoto(id).cache();
Subscription sub = request.subscribe(photo -> handleUserPhoto(photo));

// перед тем, как активити пересоздаётся
sub.unsubscribe();

// когда она пересоздалась
request.subscribe(photo -> handleUserPhoto(photo));

При этом нужно сохранять где-то вне активити request, это должен быть тот же объект. Это не серебряная пуля, в разных случаях надо поступать по-разному. Для того, чтобы гарантированно отписываться при пересоздании проще использовать CompositeSubscribtion.
Подробнее здесь почитать можно: blog.danlew.net/2014/10/08/grokking-rxjava-part-4
И, вроде бы, на хабре был перевод.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Tiberal
Можно все обернуть в лоадер, он привязан к жизненному циклу
или вот https://github.com/trello/RxLifecycle
Ответ написан
@finCoder
Также можно сохранять в Retaince Fragment, который будет выглядеть примерно так

public class RetainFragment<T> extends Fragment {

    @NonNull
    public static <T> RetainFragment<T> newInstance() {
        final RetainFragment<T> retainFragment = new RetainFragment<>();
        retainFragment.setRetainInstance(true);
        return retainFragment;
    }

    private T object;

    @NonNull
    public T getObject() {
        return object;
    }

    public void setObject(@NonNull T object) {
        this.object = object;
    }
}

Здесь неплохой пример
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы