次のようなアクティビティがあるとします。
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 部分で何かを変更する必要があると思います。何を変更するかについてのアイデアはありますか?