如何在onPostExecute中确定该活动现在没有暂停或被销毁?

时间:2012-05-21 12:40:45

标签: android android-activity android-asynctask

我启动AsyncTask并将Context放在任务的构造函数中。

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

为此,我可以:

  • onCreate活动中创建randomNumber,然后将其放入Application类;

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

  • onPreExecute()中获取randomNumber并在onPostExecute中将randomNumber与应用randomNumber进行比较。

可能我可以使用Context做出决定......?

3 个答案:

答案 0 :(得分: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()中更新它


另一种方法是在SkeletonActivity

中包含一个Context实例
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;
    }
}

答案 1 :(得分:0)

请看一下这个例子。我将Context存储在AsyncTask中。在onRetainNonConfigurationInstance()期间,我将其设置为null,在onCreate()期间,我将Context修补到当前运行的Activity。你可以通过设置" task = null"来增强它。在onDestroy():

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;
    }
}

答案 2 :(得分:0)

对其他人来说,这将是完全有用的。

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

   boolean isActivityclosed=false;

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

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

    }

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

相关问题