2

タスクのコンストラクターを開始AsyncTaskして入れます。Context

オンonPostExecute私が知りたいのは、私のアクティビティが現在アクティブであり、再作成されていないことです. どのようにするのが良いですか?

このために、次のことができます。

  • Activity でrandomNumber を作成しonCreate、それをApplicationクラスに入れます。

  • onPause/onDestroy は randomNumber を 0 に設定し、randomNumber をonResume復元します。

  • 乱数をonPreExecute()取得し、onPostExecute乱数をアプリケーションの乱数と比較します。

Context を使用して意思決定を行うことはできますか ... ?

4

3 に答える 3

0

この例を見てください。Context を AsyncTask に保存します。onRetainNonConfigurationInstance() 中に null に設定し、onCreate() 中にコンテキストを現在実行中のアクティビティにパッチします。onDestroy() で「タスク = null」を設定することで、これを強化できます。

public class MyActivity extends Activity {

    /* package */ MyActivity context;

    private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

        public MyAsyncTask(final MyActivity context) {
            super();

            this.context = context;
        }

        @Override
        protected Cursor doInBackground(/* ... */) {
            // ...
        }

        @Override
        protected void onPostExecute(/* ... */) {
            if (context != null) {
                // ...
            }
        }

        @Override
        protected void onPreExecute (/* ... */) {
            // ...
        }
    }

    /* package */ MyAsyncTask task;

    @Override
    public void onCreate(final Bundle bundle) {
        // ...

        Bundle bundleExtras = getIntent().getExtras();
        if (bundleExtras != null) {
            task = (MyAsyncTask) getLastNonConfigurationInstance();
            if (task != null) {
                task.context = this;
                // ...
            } else {
                task = new MyAsyncTask(this);
                task.execute();
            }
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        if (task != null) {
            // ...

            task.context = null;
        }

        return task;
    }
}
于 2012-05-21T13:03:54.713 に答える
0

アクティビティがまだ存在するかどうかを確認する方法は多数あります。

私は通常SkeletonActivity、次の構造で を作成します。

public class SkeletonActivity extends FragmentActivity {
    private boolean paused = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        paused = false;
    }
    @Override
    public void onPause() {
        super.onPause();
        paused = true;
    }
    @Override
    public void onResume() {
        super.onResume();
        paused = false;
    }
    @Override
    public void onStart() {
        super.onStart();
        paused = false;
    }
    public boolean isPaused() {
        return paused;
    }
}

これで、すべてのアクティビティがこれを拡張しますSkeletonActivity。最後に、この基本クラスを変更して、一時停止フラグを必要に応じて変更します (たとえば、onDestroy()


別の方法は、内に Context インスタンスを作成することSkeletonActivityです:

public class SkeletonActivity extends FragmentActivity {
    private Context mContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
    }
    @Override
    protected void onDestroy() {
        mContext = null;
        super.onDestroy();
    }
    public boolean isPaused() {
        return mContext==null;
    }
}
于 2012-05-21T13:01:36.977 に答える