web-dev-qa-db-ja.com

OKHttpを使用して、AsyncTaskの同期リクエストとOKhttp非同期リクエストの違いは何ですか?

OKHttpは 同期および非同期API の両方をサポートします。非同期リクエストを発行したい場合は、次のことができます。

  1. AsyncTaskを使用して、OKhttp同期APIを発行します。
  2. OKhttp非同期APIを発行します。

これら2つのオプションの違いは何ですか?そしてどちらが良いですか?

29
NeoWang

かなり違います!

HTTPリクエストにAsyncTaskを使用することは、Androidで実行できる最も悪いことの1つです。無条件に回避するのが最善の問題と落とし穴が山積しています。たとえば、実行中にリクエストをキャンセルすることはできません。 AsyncTaskを使用するパターンでは、Activity、Android development。

OkHttpの非同期は、多くの理由で非常に優れています。

  • ネイティブのキャンセルをサポートしています。リクエストが処理中の場合、Callbackへの参照は解放され、呼び出されることはありません。また、リクエストがまだ開始されていない場合は、実行されません。 HTTP/2またはSPDYを使用している場合は、実際にリクエストの途中で帯域幅と電力を節約することができます。
  • 複数のリクエストにタグを付け、それらをすべて1回のメソッド呼び出しでキャンセルできます。つまり、たとえばActivityで行うすべてのリクエストは、Activityインスタンスでタグ付けできます。次に、onPauseまたはonStopで、Activityインスタンスでタグ付けされたすべてのリクエストをキャンセルできます。
  • HTTP/2またはSPDYを使用している場合、リクエストとレスポンスはリモートサーバーへの単一の接続で多重化され、非同期Callメカニズムを使用することで、ブロッキングバージョンよりもはるかに効率的です。

したがって、可能であればCall.enqueue

60
Jake Wharton

何もない。 OKHttp非同期は、OKHttp API駆動です。したがって、すべてのプラットフォームでjarファイルをバンドルする限り、問題はありません。 AsyncTaskはAndroid=物事を行う方法です。

ただし、Honeycomb Asyncタスクはタスクを並列ではなく順次実行します。つまり、AsyncTaskの実行メソッドは、UIスレッドからジョブを実行する新しいスレッドにまたがっていますが、1つのAsyncTaskに送信されたすべてのタスクは同じスパンされたスレッドで実行されます。

したがって、送信された3つのタスクについて、3つのスレッドを取得しないでください。それらはすべて、単一のスパンされたスレッドで順次実行されます。 OKHttpを使用すると、コールバックと非同期のGETおよびPOSTを使用して真の並列処理を実現できます。

AsyncTaskメソッドで真の並列処理を行うこともできますが(AsyncTaskでオーバーロードされた実行メソッドを確認してください)、デフォルトのAndroidの動作はそうではありません。

1
Nazgul