1

私は最近SOを調べて同じ質問に対する答えをここで見つけましたが、そうするリスクに関して質問に向けられた答えはありませんでした。しかし、基本的には、別のメソッドAsyncTask内で別のを実行したいと思います。これは悪いアプローチですか、および/または潜在的な副作用を残しますか? doInBackground()AsyncTask

作業中に実行していることを知っていますが、onPostExecute()これまでの経験から、最初onPostExecute()からメインスレッドに戻って実行されるため、問題は発生していませんAsyncTask

4

2 に答える 2

4

APIドキュメントから:

•タスクインスタンスは、UIスレッドで作成する必要があります。

doInBackground()はバックグラウンドスレッドで実行されます。したがって、doInBackground()から別の非同期タスクを作成して実行することはできません。

http://developer.android.com/reference/android/os/AsyncTaskスレッドルールのトピックをご覧ください。

非同期タスクが実行されると、タスクは4つのステップを経ます:(ドキュメントから直接)

1.onPreExecute()、タスクが実行される前にUIスレッドで呼び出されます。この手順は通常、ユーザーインターフェイスに進行状況バーを表示するなどしてタスクを設定するために使用されます。

2. doInBackground(Params ...)。onPreExecute()の実行が終了した直後にバックグラウンドスレッドで呼び出されます。このステップは、時間がかかる可能性のあるバックグラウンド計算を実行するために使用されます。非同期タスクのパラメーターは、このステップに渡されます。計算の結果はこのステップで返される必要があり、最後のステップに戻されます。このステップでは、publishProgress(Progress ...)を使用して、1つ以上の進行状況を公開することもできます。これらの値は、UIスレッドのonProgressUpdate(Progress ...)ステップで公開されます。

3.onProgressUpdate(Progress ...)、publishProgress(Progress ...)の呼び出し後にUIスレッドで呼び出されます。実行のタイミングは未定義です。このメソッドは、バックグラウンド計算の実行中に、ユーザーインターフェイスであらゆる形式の進行状況を表示するために使用されます。たとえば、プログレスバーをアニメーション化したり、テキストフィールドにログを表示したりするために使用できます。

4.onPostExecute(Result)、バックグラウンド計算が終了した後にUIスレッドで呼び出されます。バックグラウンド計算の結果は、パラメーターとしてこのステップに渡されます。

最初に導入されたとき、AsyncTasksは単一のバックグラウンドスレッドでシリアルに実行されていました。DONUTから、これはスレッドのプールに変更され、複数のタスクを並行して操作できるようになりました。HONEYCOMB以降、並列実行によって引き起こされる一般的なアプリケーションエラーを回避するために、タスクは単一スレッドで実行されます。

本当に並列実行が必要な場合は、THREAD_POOL_EXECUTORを使用してexecuteOnExecutor(java.util.concurrent.Executor、Object [])を呼び出すことができます。

また、代替のRoboSpiceの使用を検討することもできます。https://github.com/octo-online/robospice

複数のスパイスリクエストを行うことができます。タスクが完了すると、UIスレッドに通知されます。ロボスパイスを見る価値があります。

于 2013-03-27T11:15:08.327 に答える
1

Honeycombリリースを除いて、AsyncTask()はシリアルに実行されます。したがって、いいえ、doInBackground()内から別のAsyncTask()を実行することはできません-私はそれを試したことがないと言うべきだと思いますが、目的の効果が得られる可能性はほとんどありません。

Google Office Hoursの1つでのAsyncTask()の実行について質問しました。「なぜシリアルからパラレルに、そしてシリアル実行に戻ったのか」と尋ねられたとき、彼らの口からまっすぐに。「それはたくさんのものを壊したからです。」

于 2013-03-27T11:15:31.893 に答える