2017-02-08 40 views
11

我試圖把我的Handler方法替換爲Rx java。 我的要求如何在Android中使用rxjava延遲後調用方法?

我想只有5 秒後調用該方法getTransactionDetails()。

使用處理器

new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
     getTransactionDetails(); 
     } 
    }, 5000); 

的Rx Java代碼這是我工作的代碼 - 它不工作

Observable.empty().delay(5000, TimeUnit.MILLISECONDS) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .doOnNext(o -> getTransactionDetails()) 
     .subscribe(); 
+0

http://stackoverflow.com/questions/33288546/rxjava-how-to-try-to-get-next-after-x-time這可能幫助 –

回答

12

doOnNext()是用於副作用。它可以用於記錄目的,因爲日誌記錄不會改變數據流。但是你想傳遞getTransactionDetails()的結果,所以你應該使用map來代替。

二,Observable.empty()創建一個Observable只傳播完成/處置消息,它既不觸發doOnNext()也不觸發map()。你能解決這個使用Observable.just()代替,但更習慣的方法是使用Observable.timer()

Observable.timer(5000, TimeUnit.MILLISECONDS) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .map(o -> getTransactionDetails()) 
     .subscribe(...); 

編輯:這是當然的,如果你關心的getTransactionDetails()結果。如果沒有,請參閱克萊德的答案。

7

它不工作,因爲delay()需要的東西要發出,但empty()居然發出什麼。

相反,您應該使用Observable.timer()

+3

或者'Completable .complete()。延遲(...)' – Kiskae

10
Observable 
    .timer(5000, TimeUnit.MILLISECONDS) 
    .subscribeOn(Schedulers.io()) 
    .map(o -> getTransactionDetails()) 
    .subscribe(); 

您不需要observeOn,因爲訂閱爲空。 使用定時器這將是比較正確的做法

25

這是我會怎麼做:

Completable.timer(5, TimeUnit.SECONDS, AndroidSchedulers.mainThread()) 
     .subscribe(this::getTransactionDetails); 

一個Completable代表沒有價值,但完成或異常的指示的延遲計算。靜態方法調用timer()返回一個Completable,在指定的時間段過去後信號完成,調用subscribe()將意味着當定時器觸發時將在當前對象上調用方法getTransactionDetails()。通過提供Scheduler作爲Completable.timer()的最後一個參數,您可以控制使用哪個線程執行getTransactionDetails()

-1

試試這個

Observable.just(true).delay(5000, TimeUnit.MILLISECONDS) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .map(o -> getTransactionDetails()) 
    .subscribe();