UIでは、いくつかのバックグラウンド作業を実行するために、別のを使用しましたThread
。しかし、他の人が示唆したように、私は現在を使用していAsyncTask
ます。
a Thread
とanの主な違いは何AsyncTask
ですか?
どのシナリオで、a Thread
またはAsyncTask
?を使用する必要がありますか?
UIでは、いくつかのバックグラウンド作業を実行するために、別のを使用しましたThread
。しかし、他の人が示唆したように、私は現在を使用していAsyncTask
ます。
a Thread
とanの主な違いは何AsyncTask
ですか?
どのシナリオで、a Thread
またはAsyncTask
?を使用する必要がありますか?
回答:
実行時間の長いタスクやCPUを集中的に使用するタスクの場合、これを行うには基本的に2つの方法があります。JavaスレッドとAndroidのネイティブAsyncTaskです。
どちらかが必ずしも他より優れているわけではありませんが、システムのパフォーマンスを最大限に活用するには、各呼び出しをいつ使用するかを知ることが不可欠です。
AsyncTaskを使用して:
以下のためにJavaスレッドを使用します。
そして、あなたを助けるかもしれないインターネット上の良いリソースがたくさんあります:
http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html
AsyncTask
、独自のスケジューラで使用することです。
Javaスレッドを使用する場合は、独自のコードで次の要件を処理する必要があります。
結果をユーザーインターフェイスにポストバックした場合のメインスレッドとの同期
スレッドをキャンセルするためのデフォルトはありません
デフォルトのスレッドプーリングなし
Androidの構成変更を処理するためのデフォルトなし
糸
スレッドは、同時実行単位です。独自の呼び出しスタックがあります。アプリケーションにスレッドを実装するには、2つの方法があります。
1つは、Threadを拡張する新しいクラスを提供し、run()メソッドをオーバーライドすることです。もう1つは、作成中にRunnableオブジェクトを持つ新しいThreadインスタンスを提供することです。スレッドは、その「開始」メソッドを呼び出すことによって実行できます。「setPriority(int)」メソッドを呼び出すことにより、スレッドの「優先度」を設定できます。
UI部分に影響がない場合は、スレッドを使用できます。たとえば、一部のWebサービスを呼び出したり、一部のデータをダウンロードしたりして、ダウンロード後に画面に表示します。次に、ハンドラをスレッドで使用する必要があります。これにより、アプリケーションがスレッドからのすべての応答を処理するのが複雑になります。
ハンドラーを使用すると、スレッドのMessageQueueに関連付けられたMessageオブジェクトとRunnableオブジェクトを送信して処理できます。各スレッドには各メッセージキューがあります。(To Doリストのように)、スレッドは各メッセージを受け取り、メッセージキューが空になるまでそれを処理します。したがって、ハンドラーが通信すると、ハンドラーは呼び出し側スレッドにメッセージを送信するだけで、処理を待機します。
Javaスレッドを使用する場合は、独自のコードで次の要件を処理する必要があります。
結果をユーザーインターフェイスにポストバックした場合のメインスレッドとの同期スレッドをキャンセルするためのデフォルトなしデフォルトのスレッドプーリングなしAndroidで構成変更を処理するためのデフォルトなし
AsyncTask
AsyncTaskを使用すると、UIスレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作しなくても、UIスレッドでバックグラウンド操作を実行して結果を公開できます。非同期タスクは、バックグラウンドスレッドで実行され、その結果がUIスレッドで公開される計算によって定義されます。
AsyncTaskは、次の4つの段階を経ます。
onPreExecute()
タスクが実行される前にUIスレッドで呼び出されます
doInbackground(Params ..)
onPreExecute()の実行が終了した直後にバックグラウンドスレッドで呼び出されます。
onProgressUpdate(Progress ..)
publishProgress(Progress ...)の呼び出し後にUIスレッドで呼び出されます。
onPostExecute(Result)
バックグラウンド計算が終了した後、UIスレッドで呼び出されます。
なぜAsyncTaskを使用する必要があるのですか?
UIスレッドで使いやすい。(したがって、呼び出し側スレッドがUIスレッドの場合に使用します)。
ハンドラーを操作する必要はありません。
さらに情報をご覧ください。ここ
糸:
Thread
パフォーマンスが向上するように、メインスレッドから実行時間の長い操作を分離するために使用する必要があります。しかし、エレガントにキャンセルすることはできず、Androidの構成変更を処理することもできません。からUIを更新することはできませんThread
。
AsyncTask
持続時間が5ミリ秒未満の作業項目を処理するために使用できます。ではAsyncTask
、javaとは異なりUIを更新できますThread
。ただし、長時間実行される多くのタスクはパフォーマンスを低下させます。
あなたはそれらの両方にいくつかのより多くの選択肢があります。
HandlerThread / HandlerおよびThreadPoolExecutor
詳細については、以下の投稿を参照してください。