2016-08-29 144 views
5

我遇到過幾個人試圖說服我使用RxJava而不是Android的標準AsyncTask構造的例子。RxJava而不是AsyncTask?

在我看來RxJava提供了更多的功能,但在打擊AsyncTask簡單丟失。

是否有適合的一種方法比其他或更一般都能RxJava甚至被認爲優於任何更好的使用情況?

+2

我看到這篇文章解釋了爲什麼,如果有幫助。 http://blog.feedpresso.com/2016/01/25/why-you-should-use-rxjava-in-android-a-short-introduction-to-rxjava.html – lsiva

+0

謝謝。它看起來有點像Scala處理併發。我會在我的項目中進行一些測試以適應RxJava。但是,你認爲AsyncTask的功能有一個基本缺陷嗎? – qantik

回答

10

當您在Java 8上使用RxJava時,可以看到RxJava的全部功能,最好使用像Retrofit這樣的庫。它可以讓您輕鬆地將操作鏈接在一起,完全控制錯誤處理。例如,考慮給定id以下代碼:

apiClient 
.getOrder(id) 
.subscribeOn(Schedulers.io()) 
.flatMapIterable(Order::getLineItems) 
.flatMap(lineItem -> 
    apiClient.getProduct(lineItem.getProductId()) 
      .subscribeOn(Schedulers.io()) 
      .map(product -> product.getCurrentPrice() * lineItem.getCount()), 
    5) 
.reduce((a,b)->a+b) 
.retryWhen((e, count) -> count<2 && (e instanceof RetrofitError)) 
.onErrorReturn(e -> -1) 
.subscribe(System.out::println); 

這將異步計算的順序的總價格,具有以下屬性:用於訂單管理微服務一個改造客戶端:指定的順序和apiClient一個int :

  • 在任一個時刻對API最多5個請求在飛行(和你可以調整IO調度程序對所有請求硬工資帽,而不僅僅是一個單一可觀察鏈)
  • 達如果發生網絡錯誤,請重試2次
  • -1失敗的情況下(一個反TBH,但是這是一個其他的討論)

此外,海事組織.subscribeOn(Schedulers.io())後,每個網絡電話應該是隱含的 - 你可以通過修改你如何創建改造客戶。對於11 + 2行代碼來說不錯,即使它比Android-ish更後端。

+0

非常感謝這個詳細的例子。我期待對這些一流的功能進行修補。在Java中很久沒有這樣做了。 – qantik

3

RxBinding/RxAndroid由傑克沃頓商學院提供了您可以使用,使異步調用一些不錯的線程功能,但RxJava提供的不僅僅是處理異步線程waaay更多的好處/功能。這就是說,有一個非常陡峭的學習曲線(IMO)。另外,應該注意的是,使用AsyncTasks沒有任何問題,您可以使用Rx(也是IMO)編寫更多雄辯的解決方案。

TLDR你應該努力使用它。 Retrofit和RxJava可以很好地協同工作,以實現AsyncTask的替換目的。

+0

很酷。那麼你會說AsyncTask對於像一個簡單的HTTP處理程序這樣的小型項目來說可以嗎? – qantik

+0

當然,但你可以用RxJava/RxBinding/RxAndroid完成同樣的事情,你可以通過這種方式獲得一些很酷的點。 –

+0

非常好。我一直在尋找優雅。 ;-) – qantik