3

より多くのカスタマイズができることはわかっていますが、同時実行ライブラリ クラスを使用することで、ストックの AsyncTask を使用したり、スレッドを作成して run を呼び出したりするよりもパフォーマンス (メモリ/速度) が向上しますか?

4

3 に答える 3

7

AsyncTask ソース コードを見ると、すべてが .NETFutureTaskの他のクラスに基づいて構築されていることがわかりますjava.util.concurrent.*

を使用するAsyncTask方が便利で純粋でFutureTaskあるとすれば、わずかなメリットしかないと思います。java.util.concurrent.*より複雑なタスクを実行するために、他の API を使用することもできます。

于 2012-05-29T20:24:46.843 に答える
2

ほとんどの場合、AsyncTaskがもたらす使いやすさです。この作業パラダイムは、このメソッドをバックグラウンドで実行し、UIスレッドでこの他のメソッドを実行すると使い勝手が良くなります(ただし、バニラAsyncTaskのサブクラスを作成することで例外処理を簡単にする改善を行いました)。AsyncTaskは、要求/応答タイプの呼び出しでサービスを呼び出すのに最適だと思います。ただし、すべてのタイプの同時実行がAsyncTaskに有効であるとは限りません。

現在、AsyncTaskが適していないタスクがいくつかあります。たとえば、サーバーから一度に複数の画像をロードする場合です。AsyncTaskは最良のオプションではないかもしれません。1つのAsyncTasksは、1回だけ実行でき、再起動できません。AsyncTasksは、バックグラウンドメソッドを実行するスレッドを所有しており、そのスレッドを再利用または共有することはできません。したがって、10または20のイメージがある場合、AsyncTasksを使用した場合、作成およびシャットダウンするスレッドが10または20であることを意味します。または、すべての画像を一度にロードします。これは、20回の個別の呼び出しによってすべての画像がサーバーから完全にロードされるまで、UIが更新されないことを意味します。優れたUI応答のために、より多くのメモリやリソースなどを支払うか、UIがオーバーヘッドを減らすための代償を払います。どちらも素晴らしいことではありません。

より良いオプションは、スレッドを1回ロードし、実行するためにいくつかの軽量ジョブを送信して、それらをUIスレッドにポストバックすることです。単一のスレッドを作成し、それに投稿されたジョブを実行するPipelineHandlerを呼び出す、AsyncTaskのような独自のバージョンを作成しました。これらのジョブは、UIスレッドから呼び出されるメソッドと、更新を実行するためにUIスレッドで呼び出される別のメソッドがあるという点で、AsyncTaskと非常によく似ています。ここでの利点は、単一のスレッドを活用して、必要な数のジョブを実行できることです。また、構成オプション以外を変更することなく、必要に応じてキューにサービスを提供するスレッドを簡単にスケールアップできます。裏では、Java並行ク​​ラスExecutorServiceを使用しますが、Handlerを利用して、UIスレッドで何かを実行する機能も提供します。

したがって、質問に答えるために、AsyncTaskは、サービス要求/応答タイプの呼び出しなどの1回限りのジョブには最適ですが、画像のダウンロードやファイルのダウンロードなどのバッチ処理には適していません。特に、一度に多数の呼び出しを行う必要がある場合はそうです。Java並行ライブラリーは、これらのタイプのタスクの実行を支援する役割を果たしますが、問題の半分、つまりスレッドでの実行のみを解決するため、制限があります。Java並行ライブラリーは、バッチジョブの実行には適していますが、UIスレッドとのインターフェースには適していません。したがって、解決策を得るには、多くの場合、それらを組み合わせる必要があります。

于 2012-05-29T20:40:02.747 に答える
0

AsyncTaskSwingWorker並行性 API ではなく、ほとんどデスクトップに匹敵します。バックグラウンドでスレッドを使用しますが、UI スレッドで UI コンポーネントと対話するのに役立つメソッドを提供します。

于 2012-05-29T20:29:25.063 に答える