1

次のようなアクティビティがあるとします。

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 (または 2 番目が既に経過している場合は 4) にしたいので、カウントダウンが実際にあるはずの場所を拾うだけです。 .

ロケットがすでに上昇している場合は、回転後もそのままにしておきたいので、カウントダウンを再開したくありません。

現時点でLiveDataReactiveStreamsは、一時停止時にサブスクリプションをキャンセルし、再開時に新しいサブスクリプションを作成するため、カウントダウンが再開されます。

これを機能させるには、コードの RxJava 部分で何かを変更する必要があると思います。何を変更するかについてのアイデアはありますか?

4

1 に答える 1