3

アプリの起動時間が遅くならないようにしたいので、ユーザー入力とは関係のないバックグラウンド タスクを開始する必要があります。たとえば、キャッシュを埋めるなどです。

AsyncTaskメソッドから開始した場合onCreatedoInBackgroundメソッドが実際に実行を開始するのはいつですか? (シングルコアデバイスを想定)

Android が完了する前にそれをスケジュールできる可能性はonCreate/onResumeありますか?それとも、UI スレッドが完全に終了するまでバックグラウンド スレッドを実行すべきではないことを認識できるほどスマートですか?

4

3 に答える 3

1

AsyncTask ソースコードを見ると、ThreadPoolExecutorタスクを実行するためにシリアルエグゼキューターを使用しているだけであることがわかります。デフォルトの内部動作は Android のバージョンによって異なります (AsyncTask ドキュメントから):

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

とにかく、doInBackground実行はActivityライフサイクルとは関係がないためAsyncTask、ほぼいつでも実行される可能性があります。これは、スレッドスケジューラExecutorによって使用されるデフォルトで、すでに開始したタスクの数にのみ依存します。AsyncTask

于 2012-07-15T20:18:33.937 に答える
0

実際に厳密に言えば、UI コードの実行順序はなく、asynctask を開始することがわかりました。通常、これは発生しませんが、何らかの理由で UI スレッドに時間がかかる場合 (外部入力の待機など) は、UI コードが終了する前に asynctask が開始された可能性があります。

UI コードの記述は、Android システムへの単なる要求であり、これは実行ループで待機します。したがって、十分なリソースがあるために asynctask がその前に開始された場合 (または前述のように、何らかの理由で UI スレッドが遅延した場合)、実行順序の保証はありません。

これを強制する簡単な方法の 1 つは、気にせず、それで十分であると確信できる場合に備えて、ScheduledExecutorService を使用して asynctask の開始を遅らせるか、「よりクリーンな」方法は、待機するある種のゲートキーパーを実装することです。フラグを true に設定してから、asynctask を開始します。または、外部デバイスとの多くの通信状況のように、フラグが true に設定されるのを待機する while ループが asynctask の開始時にある場合もあります。

フラグは、UI が完了したことを (通常は) 確信できるようになった後に true に設定されます。

于 2012-07-15T21:41:24.253 に答える
0

私は通常、次のようAsyncTaskに s を使用します。onCreate()

private MySuperSpecialTask mySuperSpecialTask;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // setContentView(...);
    // [...]

    mySuperSpecialTask = new MySuperSpecialTask();
    mySuperSpecialTask.execute();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mySuperSpecialTask != null) {
        mySuperSpecialTask.cancel(true);
    }
}

これにより、タスクが開始される前にすべてが初期化されます。

于 2012-07-15T21:26:36.013 に答える