用RXJava替换Android处理程序

时间:2016-04-14 07:34:25

标签: android handler rx-java

在Activity中,我有一些用户操作超时。如果用户什么都不做,我需要为系统产生一些其他动作。 为此我使用Handler

window.addEventListener("beforeunload", function (event) {
  event.returnValue = "Are you sure?";
});

可以停止处理程序以执行某些用户操作,例如按钮

protected void stopTimeout()
{
    handler.removeMessages(0);
}

private void startTimeout()
{
    stopTimeout();
    handler.postDelayed(new Runnable()
    {
        @Override
        public void run()
        {
            //SOME ACTIONS
        }
    }, 180 * 1000L);
}

但目前我必须使用许多用户操作变体。所有这些从异步线程和处理程序推送到stopTimout看起来不是正确的决定。 项目我已经迁移到RXJava和

我可以弄清楚如何使用RXJava完成这部分。

2 个答案:

答案 0 :(得分:1)

启动计时器。

private void startTimeout() {
    stopTimeout();

    Observable<Long> observable = Observable
            .timer(getKeepMyOrderOnDisplayTime(),
                    TimeUnit.SECONDS, Schedulers.computation());
    cancelOrderSubscription = observable
            .subscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .map(new Func1<Long, MyOrderStorageItem>() {
                @Override
                public MyOrderStorageItem call(Long aLong) {
                    return myOrderStorageItem;
                }
            })
            .subscribe(new Action1<MyOrderStorageItem>() {
                @Override
                public void call(final MyOrderStorageItem myOrderStorageItem) {
                    // SOME ACTION with object, I need
                }
            });
}

停止计时器。

protected void stopTimeout() {
    if (cancelOrderSubscription != null) {
        cancelOrderSubscription.unsubscribe();
        cancelOrderSubscription = null;
    }
}

在用户操作上添加停止计时器运行。如果在计时器时没有用户操作,则默认操作将为。

答案 1 :(得分:1)

简单:

subscription = Observable.timer(1000, TimeUnit.MILLISECONDS)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(aLong -> whatToDo());

private void whatToDo() {
   System.out.println("Called after 1 second");
}