やりたいこと
Observable.interval
を使って5秒おきにViewを操作させるアプリがあったとする。
アプリがバックグラウンドになればView操作を停止、フォアグラウンドならView操作を再開させたい。
これをRxJavaで実装してみた。
コード
private AtomicBoolean resumed = new AtomicBoolean();
private AtomicBoolean stopped = new AtomicBoolean();
private void start() {
Observable.interval(5, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.takeWhile(new Predicate<Long>() {
@Override
public boolean test(Long aLong) throws Exception {
return !stopped.get();
}
})
.filter(new Predicate<Long>() {
@Override
public boolean test(Long aLong) throws Exception {
return resumed.get();
}
})
.subscribeWith(new DisposableObserver<Long>() {
@Override
public void onNext(Long aLong) {
logger.d("onNext " + aLong);
// ここに動作させたい処理
}
@Override
public void onError(Throwable e) {
logger.e(e.getMessage());
}
@Override
public void onComplete() {
logger.d("onComplete");
}
})
}
@Override
public void onResume() {
super.onResume();
resumed.set(true);
stopped.set(false);
start();
}
@Override
public void onPause() {
super.onPause();
resumed.set(false);
stopped.set(true);
}
感想
希望する動作をしてくれてはいるが、本当はKotlin+Coroutineで実装したかった。
今回はJavaという制約があったので仕方ない。