2

我启动AsyncTask并放入Context任务的构造函数。

onPostExecute我想知道我的活动现在是否处于活动状态并且未被重新创建。怎么做比较好?

为此,我可以:

  • 在Activity中创建randomNumber,onCreate然后放到Applicationclass中;

  • onPause/onDestroy 将 randomNumber 设置为 0 并onResume恢复 randomNumber;

  • onPreExecute()获取随机数onPostExecute并将随机数与应用程序随机数进行比较。

也许我可以使用 Context 来做出决定......?

4

3 回答 3

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 回答
0

请看一下这个例子。我确实将上下文存储在 AsyncTask 中。在 onRetainNonConfigurationInstance() 期间,我将其设置为 null,在 onCreate() 期间,我将 Context 修补到当前正在运行的 Activity。您可以通过在 onDestroy() 中设置“task = 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

这对其他人会很有帮助。

如果您按下主页按钮或返回按钮 onStop() 将被调用。所以在活动中声明一个变量,如

   boolean isActivityclosed=false;

在 onStop() 方法期间将值设置为 true。

 @Override
    protected void onStop() {
        super.onStop();
        isActivityclosed=true;

    }

现在,在 postExcecute 方法中检查变量是否为真。如果它是真的那么你的活动是在后台。

于 2017-11-28T11:52:59.630 回答