簡體   English   中英

如何使用RxJava和Android訂閱執行任務

[英]How to subscribe to execution of a task using RxJava and Android

我只是將腳趾浸入RxJava中,所以請保持柔和:)到目前為止,我對AsyncTasks還是可以的,但是它變得越來越復雜,我認為我終於偶然發現了我實際上在努力通過簡單的AsyncTasks來滿足的要求。 這是我的用例:

1)我有一個方法(讓它checkNetwork() ),它需要在一個會話中運行一次。 如果先前已運行,則返回並帶有緩存的響應。 否則,它將執行網絡調用,然后根據結果執行另一個。 這些網絡任務都使用OkHttp運行,並且是同步的。 該方法本身從AsyncTask運行。 例如:

public class MyApis{

  private boolean mCachedResult;
  private boolean mNetworkChecked;

  ....

  public boolean checkNetwork() {
    if (mNetworkChecked) {
      return mCachedResult;
    }
    doFirstCall();
    // check response, set flags and potentially return
    doSecondCall();
    // check response, set flags, i.e.

    mCachedResult = response.blah
    mNetworkChecked = true;
  }

  public boolean isNetworkChecked(){
    return mNetworkChecked;
}

2)我的代碼有多個部分將運行isNetworkChecked() ,如果沒有,請調用checkNetwork() checkNetwork()網絡狀況不佳的情況下, checkNetwork()將花費其甜蜜的時間,而isNetworkChecked()將返回false。 這將生成並排隊很多AsyncTask。 是的,這些任務將很快解決,但是我在執行器上使用默認隊列大小遇到了問題。

據我了解,RxJava可以幫助我。 我想做的是只運行一次checkNetwork() ,並且如果它已經在運行,而不是對AsyncTasks進行排隊,只需訂閱,等待它完成並根據響應執行我的代碼(即,示例中的mCachedResult ) 。

您可以在RxJava 1.0.15 fromCallablereplay(1)結合使用:

Observable<Blah> blahs = Observable.fromCallable(() -> {
    doFirstCall();
    doSecondCall();
    return response.blah;
})
.subscribeOn(Schedulers.io())
.replay(1).autoConnect(0);

blahs.observeOn(AndroidSchedulers.mainThread())
.subscribe(...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM