2

ユーザーが [戻る] ボタンを押してアクティビティを終了したときに非同期タスクがまだ終了していない場合、フラグメントの onDestroy イベントで asyncTask でキャンセルを呼び出す必要がありますか?

fragmentActivity への前回のアクセスからの asyncTask がまだ実行中、終了していない、またはまだキャンセルされていない場合に、asyncTask の既存のインスタンスがまだ実行されている可能性があるかどうかも確認する必要がありますか?

4

1 に答える 1

6

する必要はありませんが、する必要があります。

その理由は、終了するまで実行を継続し、ハニカムから開始して、すべてのasyncTasksに1つのスレッドのみを使用するためです。

とにかく、asyncTaskは通常、1〜10秒などの短時間のタスクに使用する必要があります。これはルールではありませんが、asyncTaskがある理由を理解するのに役立ちます-バックグラウンドでタスクを実行できるようにします。

APIからのasyncTaskに関するいくつかの注意事項は次のとおりです。

「AsyncTaskはスレッドとハンドラーの周りのヘルパークラスとして設計されており、一般的なスレッドフレームワークを構成しません。AsyncTasksは理想的には短い操作(最大で数秒)に使用する必要があります。スレッドを長期間実行し続ける必要がある場合時々、Executor、ThreadPoolExecutor、FutureTaskなどのjava.util.concurrentパッケージによって提供されるさまざまなAPIを使用することを強くお勧めします。」

execute()のAPI :

「HONEYCOMBを開始すると、並列実行によって引き起こされる一般的なアプリケーションエラーを回避するために、タスクが単一スレッドで実行されるようになります。本当に並列実行が必要な場合は、このメソッドのexecuteOnExecutor(Executor、Params ...)バージョンをTHREAD_POOL_EXECUTORで使用できます。 ;ただし、その使用に関する警告については、そこにある解説を参照してください。」

とにかくasyncTaskをバックグラウンドタスクとして使用する場合は、インスタンスが1つしかないことを確認するか(不要な場合はキャンセルすることを忘れないでください)、Googleが推奨する次のコードを使用してください。

public static <T> void runAsyncTaskInMultipleThreads(final AsyncTask<T,?,?> asyncTask,final T... params)
    {
    if(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.HONEYCOMB)
      asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,params);
    else asyncTask.execute(params);
    }
于 2012-08-21T21:16:30.213 に答える