0

さまざまなサイズの単語や画像を描画するカスタム ビューがあります。さまざまなユーザー アクションに対してあらゆる種類の計算を実行する必要があり、それらは 3 ~ 4 秒続く可能性があるため、ユーザーが待機している間に進行状況ダイアログを表示する方法を実装する必要があります。

シナリオは次のとおりです。たとえば、ユーザーがいくつかのテキストと画像を追加し、使用可能なビューのスペースに収まるまでサイズを変更する必要があります。これはすべて、私のカスタム ビューのメソッドで行われます。

私の場合、スレッド化と不確定な進行状況ダイアログを使用する最良の方法は何でしょうか?

asynctask を使用して、操作が行われるたびに呼び出す必要がありますか? 単純なスレッドを使用しますか? ビューでスレッドを使用したことがない

4

1 に答える 1

1

基本的に 2 つのオプションがあります。どちらが優れているかを判断するのは簡単ではありません。

AsyncTaskここでは確かにオプションです。優れた点は、UI との同期を構成することです。計算結果をdoInBackground()(同時に実行される) からonPostExecute()(UI スレッドで実行される) に渡すので、計算を実行して UI を安全に更新できます。publisProgress()/onProgressUpdate()メソッドのペアを介して、UI スレッドでのバックグラウンド処理の進行状況を示すこともできます。

ただし: AsyncTask の動作は、API 1 と API 17 の間で 2 回変更されました。デバイスが実行する Android のバージョンに応じて、デフォルトで、複数の AsyncTask を並行して実行するかどうかを指定できます。executeOnExecutor()これが重要な場合は、使用する必要があります。この呼び出しは API 11 で導入されました。つまり、11 より前の API をサポートする場合は、リフレクションに対処する必要があります。

2 番目のオプションは、明示的な worker を使用することThreadです。このアプローチの魅力は、アプリで頻繁に発生し、バックグラウンドで実行する必要があるタスク専用のスレッドがあることです。ただし、UI 同期の問題はすべて自分で処理する必要があります。規律があれば難しいことではありません。View変更が必要なオブジェクトをThread が認識している場合はView.post()View.postDelayed()などのメソッドを使用して、ビューへの参照を持ち、UI スレッドで実行されるコードのフラグメントをスケジュールできます。

どちらのアプローチを選択しても、さらに 2 つの影響に直面します。

  • Android はあなたThreadとあなたの両方AsyncTaskをバックグラウンド優先で実行します。CPU を集中的に使用する場合、調整しないと実行時間が 10 倍になります。詳細な議論については、AsyncTask に対する私の回答を参照してください。.

  • 非同期タスクでの View 参照には注意が必要です。ユーザーが [戻る] を押したか、デバイスの回転などの構成変更によりアクティビティが再作成されたため、ビューが存在しなくなった可能性があります。これが意味することは、多くの場合、Activity から出てすぐに再入力することで、多くのスレッドを開始する方法をユーザーに提供し、表示されなくなった View オブジェクトへの参照を保持する Threads をどんどん追加していることです。賢くなりたいのに計算に時間がかかる場合は、スレッドを新しいアクティビティに再アタッチすることをお勧めします (状況によって異なります)。スレッドがクリーンな方法で終了し、アクティビティがなくなった場合にすべてのリソースを解放することを確認する場合は、今のところこれを無視しても安全です。

于 2013-04-14T10:13:49.757 に答える