2014-12-07 42 views

回答

55

相當多的不同!

對HTTP請求使用AsyncTask幾乎是您在Android上可以做的最糟糕的事情之一。它充滿了無條件避免的問題和疑難雜症。例如,您不能在執行期間取消請求。使用AsyncTask的模式通常也會泄漏對Android開發的一個主要罪惡Activity的引用。

OkHttp的異步是有很多原因大大優於:

  • 它支持原生取消。如果請求正在進行中,則對Callback的引用將被釋放並且不會被調用。另外,如果請求還沒有開始,它永遠不會被執行。如果您使用HTTP/2或SPDY,我們實際上可以取消中間請求的節省帶寬和功耗。
  • 它支持標記多個請求並使用單個方法調用取消它們。這意味着您在Activity中發出的每個請求都可以使用Activity實例進行標記。然後在或onStop中,您可以取消所有使用Activity實例標記的請求。
  • 如果您使用的是HTTP/2或SPDY請求,並且通過單個連接將響應複用到遠程服務器,並且通過使用異步機制,這比攔截版本更有效。

所以如果可以的話,請使用Call.enqueue

1

沒什麼。 OKHttp異步是OKHttp API驅動的。所以只要你把所有平臺的瓶子捆綁在一起,你應該很好。 AsyncTask是Android做事的方式。

但是,由於蜂窩異步任務按順序運行任務並且不是並行運行。這意味着儘管AsyncTask的執行方法跨越了一個新的線程,該線程將您的作業從UI線程運行,但發送到一個AsyncTask的所有任務都運行在相同的跨線程中。

因此,對於提交的3個任務,您不會獲得3個線程,它們都將在單個跨接線程上按順序運行。使用OKHttp,您可以使用回調和異步GET和POST實現真正的並行性。

儘管您也可以在AsyncTask方法中執行真正的並行性(檢查AsyncTask中的重載執行方法),但默認的Android行爲不是這樣做的。