まず、Android Docsに記載されている一般的な注意事項:
AsyncTasks should ideally be used for short operations (a few seconds at the most). If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent pacakge such as Executor, ThreadPoolExecutor and FutureTask.
質問に答えるには:
- はい - 非同期タスクを単なるバックグラウンド スレッドのように使用できます。非同期タスクは単なるラッパーで
Thread
ありHandler
、スレッドが UI スレッドとシームレスに通信できるようにします。警告!UI スレッドを更新する予定がある場合、または UI スレッドを参照するコールバック (つまり、onProgressUpdated および/または onPostExecute) でアクティビティまたはフラグメントを参照する場合は、アクティビティまたはフラグメントがまだ実行可能な状態であることを明示的に確認する必要があります。参照して使用します。たとえば、フラグメントから AsyncTask を起動する場合の正しい方法と間違った方法は次のとおりです。
アクティビティへの参照を使用してタスクを作成し、完了時に何かを実行できるようにします。
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
Fragment mFragment;
public DownloadFilesTask(Fragment fragment){
mFragment = fragment;
}
違う:
protected void onPostExecute(Long result) {
// if the fragment has been detached, this will crash
mFragment.getView().findView...
}
右:
protected void onPostExecute(Long result) {
if (mFragment !=null && mFragment.isResumed())
... do something on the UI thread ...
}
}
AsyncTask の実行中にアクティビティが停止した場合、アクティビティは引き続き実行されます。上記の手法を使用して、タスクを開始したコンテキストのライフサイクルをチェックすることで、クラッシュを回避できます。
最後に、UI スレッドをまったく必要としない非常に長時間実行される操作がある場合は、Serviceの使用を検討する必要があります。ここに宣伝文句があります:
A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use