Вот.

м, у меня есть такая деятельность:

public class TestActivity extends AppCompatActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final TextView countdown = new TextView(this);
        setContentView(countdown);

        ViewModelProviders.of(this)
                .get(TestViewModel.class)
                .getCountdown()
                .observe(this, countdown::setText);
    }
}

И модель представления:

class TestViewModel extends ViewModel {
    private final LiveData<String> countdown =
            LiveDataReactiveStreams.fromPublisher(
                    Flowable.concat(
                            Flowable.just("Falcon Heavy rocket will launch in..."),
                            Flowable.intervalRange(0, 10, 3, 1, TimeUnit.SECONDS)
                                    .map(x -> String.valueOf(10 - x)),
                            Flowable.timer(1, TimeUnit.SECONDS)
                                    .map(ignored -> "Lift off!")
                    )
            );

    LiveData<String> getCountdown() {
        return countdown;
    }
}

Я хочу правильно обрабатывать вращение, поэтому, если пользователь поворачивает свое устройство, пока обратный отсчет говорит 5, я хочу, чтобы следующее значение после поворота было 5 (или 4, если второе уже прошло), просто возьмите, где обратный отсчет должен быть на самом деле ,

Если ракета уже взлетела, я хочу, чтобы она продолжала вращаться, я не хочу, чтобы отсчет снова начался.

Сейчас,LiveDataReactiveStreams отменяет подписку при приостановке и создает новую подписку при возобновлении, поэтому отсчет времени начинается заново.

Я предполагаю, что я должен изменить что-то в моей части кода RxJava, чтобы это работало. Есть идеи, что изменить?

Ответы на вопрос(1)

Решение Вопроса

Android United Slack канал кто указалBehaviorSubject а такжеBehaviorProcessor мне и предложили идею как это исправить.

Я изменил свою модель вида на:

class TestViewModel extends ViewModel {

    private LiveData<String> countdown;

    LiveData<String> getCountdown() {
        if (countdown == null) {
            countdown = LiveDataReactiveStreams.fromPublisher(startCountdown());
        }
        return countdown;
    }

    private static Flowable<String> startCountdown() {
        final BehaviorProcessor<String> processor = BehaviorProcessor.create();
        Flowable.concat(
                Flowable.just("Falcon Heavy rocket will launch in..."),
                Flowable.intervalRange(0, 10, 3, 1, TimeUnit.SECONDS)
                        .map(x -> String.valueOf(10 - x)),
                Flowable.timer(1, TimeUnit.SECONDS)
                        .map(ignored -> "Lift off!")
        ).subscribe(processor);
        return processor;
    }
}

Таким образом, я могу начать обратный отсчет только один раз вgetCountdown иBehaviorProcessor создано вstartCountdown заботится о доставке последних и впоследствии отправленных значений своим подписчикам (LiveData в этом случае).

посколькуLiveDataReactiveStreams нуженFlowableудобно использоватьBehaviorProcessor вместоBehaviorSubject Вот.

Ваш ответ на вопрос