5

私は、AsyncTasksが起動アクティビティとともに破棄されないというステートメントをテストしました。そしてそれは本当です。

AsyncTaskに、Log.i()3秒ごとに1分間メッセージを公開するようにしました。そして、活動の方法にLog.i()メッセージを入れました。onDestroy()

アクティビティが破棄されているのがわかりますが、AsyncTaskは20個のメッセージをすべて終了するまで実行を続けLog.i()ます。

そして、私は混乱しています。

  1. AsyncTaskがpublishProgress()破棄されたUIに入った場合はどうなりますか?
    なんらかの例外が発生すると思いますよね?

  2. AsyncTaskがデータをグローバル変数に格納する場合はどうなりclass Applicationますか?
    ここではわかりません、NullPointer例外ですか?

  3. アプリを再起動するとどうなりますか?
    おそらく新しいAsyncTaskを起動します。まだ実行中のAsyncTaskと再接続できますか?

  4. マザーアプリが破棄された後、AsyncTaskは不滅ですか?
    たぶんそうです、UIアプリケーションが表示されなくなったり、破壊されたりしている間、すべてのLogCatアプリがメッセージのログを記録し続けるにはどうすればよいでしょうか。そして、それらを再度開くと、「死んでいる」間に生成されたメッセージが表示されます。

これはすべて議論のように思えますが、質問はタイトルにあります。私はこの孤立したAsyncTaskを持っています。これは、アプリが再起動されたときに再接続したいのですが、その方法がわかりません。

なぜこれが非常に重要なのかを説明するのを忘れました。向きの変更が発生すると、アプリは破棄されます。また、AsyncTaskによって生成されたデータを失いたくないので、停止して再起動したくありません。向きを変えた後も続けて再接続したいだけです。

4

1 に答える 1

1

使用しなくなった古いコードからのものであるため、これが正しいことを願っています(現在はを使用しIntentServiceてこれまでのコードを実行しています)。

これは、メインでファイルをダウンロードしたときに最初に持っていたものActivityです...

public class MyMainActivity extends Activity {

    FileDownloader fdl = null;

    ...

    // This is an inner class of my main Activity
    private class FileDownloader extends AsyncTask<String, String, Boolean> {
        private MyMainActivity parentActivity = null;

        protected void setParentActivity(MyMainActivity parentActivity) {
            this.parentActivity = parentActivity;
        }

        public FileDownloader(MyMainActivity parentActivity) {
            this.parentActivity = parentActivity;
        }

      // Rest of normal AsyncTask methods here

    }
}

重要なのは、onRetainNonConfigurationInstance()を「保存」するために使用することAsyncTaskです。

Override
public Object onRetainNonConfigurationInstance() {

    // If it exists then we MUST set the parent Activity to null
    // before returning it as once the orientation re-creates the
    // Activity, the original Context will be invalid

    if (fdl != null)
        fdl.setParentActivity(null);
    return(fdl);
}

次に、指示が真の場合にdoDownload()呼び出されるメソッドがあります。のメソッドで設定されます。onResume()BooleandownloadCompleteBooleanonPostExecute(...)FileDownloader

private void doDownload() {
    // Retrieve the FileDownloader instance if previousy retained
    fdl = (FileDownloader)getLastNonConfigurationInstance();

    // If it's not null, set the Context to use for progress updates and
    // to manipulate any UI elements in onPostExecute(...)
    if (fdl != null)
        fdl.setParentActivity(this);
    else {
        // If we got here fdl is null so an instance hasn't been retained
        String[] downloadFileList = this.getResources().getStringArray(R.array.full_download_file_list);
        fdl = new FileDownloader(this);
        fdl.execute(downloadFileList);
    }
}
于 2012-05-21T17:00:45.450 に答える