1

AsyncTaskは長いプロセスには適していないことを知っています。彼らの主な目的は、UI スレッドから負荷を取り除き、バックグラウンドで処理を行うことです。後で完了したら、それぞれのUI スレッドを更新します。

doInBackgroundの実行後に UI を更新する必要があり、アクティビティが破棄される可能性がある場合など、メモリ リークが発生することは承知しています。

私の質問は、単純なThreadのようにAsyncTaskを使用できますか?

Activity または Application が停止した場合、AsyncTaskはどうなりますか?

要件

UI を更新する必要はありません。

自分のタスクを (それを開始する) アクティビティに関連付けたくありません。

4

5 に答える 5

1

アプリケーションが強制終了またはクラッシュしても、バックグラウンドで開始されたままになります。

于 2013-04-09T13:29:08.687 に答える
1

まず、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.

質問に答えるには:

  1. はい - 非同期タスクを単なるバックグラウンド スレッドのように使用できます。非同期タスクは単なるラッパーで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 ...
    }
}
  1. AsyncTask の実行中にアクティビティが停止した場合、アクティビティは引き続き実行されます。上記の手法を使用して、タスクを開始したコンテキストのライフサイクルをチェックすることで、クラッシュを回避できます。

  2. 最後に、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

于 2013-04-09T15:15:55.323 に答える
0

私の質問は、単純なスレッドのように AsyncTask を使用できますか?

はいAsyncTask、Android バックグラウンド スレッドです。タスクはバックグラウンドで実行されます。 AsyncTask新しい Thread が自動的に作成されるため、 doInBackground() で行うことはすべて別のthread.

Activity または Application が停止した場合、AsyncTask はどうなりますか?

AsyncTaskに関連しています。破棄または終了すると、関連するすべてapplication が 終了し ます。applicationAsyncTaskapplication

于 2013-04-09T13:32:25.790 に答える