用 RXJava 替换 Android 处理程序

Replace Android handler with RXJava

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

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

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

可以为某些用户操作停止处理程序,例如单击按钮

    btnCancel.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            // user actions
            stopTimeout();
        }
    });

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

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

开始计时。

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;
    }
}

根据用户操作添加停止计时器 运行。如果在计时器期间没有用户操作,则默认操作。

很简单:

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");
}