2016-04-14 70 views
-1

在活動中,我對用戶操作有某種超時。如果用戶什麼都不做,我需要爲系統產生一些其他操作。 爲此,我現在用的處理器用RXJava替換Android處理程序

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

但此刻我必須對用戶的動作有很多變種,處理器可以被停止。所有這些從異步線程和處理程序中push stopTimout並不是正確的決定。 項目我已經遷移到RXJava和

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

+0

建議使用'removeMessagesAndCallbacks(空)'清理處理程序。 – Shark

+0

回調地獄,沒有thx,只是從項目中刪除了所有這些 –

回答

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

用戶操作添加停止計時器運行。如果定時器沒有用戶操作,默認動作會。

0

其簡單:

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