これは非常に良い質問です。Androidプログラマーとして問題を完全に理解するには時間がかかります。実際、AsyncTaskには、関連する2つの主な問題があります。
- 彼らは活動のライフサイクルとの結びつきが不十分です
- 彼らは非常に簡単にメモリリークを作成します。
RoboSpice Motivationsアプリ(Google Playで入手可能)内で、その質問に詳細に答えます。AsyncTasks、ローダー、それらの機能と欠点の詳細なビューを提供し、ネットワークリクエストの代替ソリューションであるRoboSpiceも紹介します。ネットワークリクエストはAndroidの一般的な要件であり、本質的に長時間実行オペレーションです。これはアプリからの抜粋です:
AsyncTaskおよびActivityライフサイクル
AsyncTaskは、Activityインスタンスのライフサイクルに従いません。アクティビティ内でAsyncTaskを開始し、デバイスを回転させると、アクティビティが破棄され、新しいインスタンスが作成されます。しかし、AsyncTaskは停止しません。完了するまで生き続けます。
そして、それが完了すると、AsyncTaskは新しいアクティビティのUIを更新しません。実際に、表示されなくなったアクティビティの以前のインスタンスを更新します。たとえば、findViewByIdを使用してアクティビティ内のビューを取得する場合、java.lang.IllegalArgumentException:ビューがウィンドウマネージャーにアタッチされていないタイプの例外が発生する可能性があります。
メモリリークの問題
AsyncTasksをアクティビティの内部クラスとして作成すると非常に便利です。AsyncTaskはタスクの完了時または進行中にアクティビティのビューを操作する必要があるため、アクティビティの内部クラスを使用すると便利です。内部クラスは外部クラスの任意のフィールドに直接アクセスできます。
それでも、これは、内部クラスがその外部クラスインスタンス(アクティビティ)に非表示の参照を保持することを意味します。
長期的には、これによりメモリリークが発生します。AsyncTaskが長時間続く場合、アクティビティは「生きたまま」維持されますが、Androidは表示されなくなるため、アクティビティを削除したいと考えます。アクティビティをガベージコレクションすることはできません。これは、Androidがデバイス上のリソースを保持するための中心的なメカニズムです。
実行時間の長い操作にAsyncTasksを使用するのは非常に悪い考えです。それでも、1秒または2秒後にビューを更新するなど、短命なものには問題ありません。
RoboSpice Motivationsアプリをダウンロードすることをお勧めします。これは実際にこれを詳細に説明し、いくつかのバックグラウンド操作を実行するためのさまざまな方法のサンプルとデモを提供します。
doInBackground
、進行状況バーが使用されていない場合、長時間実行される関数が画面をフリーズさせることでした。