Android AsyncTasks如何检查活动是否仍在运行

时间:2012-06-25 12:40:23

标签: android android-asynctask

我已将AsyncTasks用于我的应用程序,以便延迟下载和更新用户界面。

现在我的AsyncTasks简单地更新了用户界面:

protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
        gender.setText(values[0]);
}

我的问题是如何检查性别TextView所呈现的活动是否仍然可用?

如果没有,我将收到错误,我的申请将关闭。

8 个答案:

答案 0 :(得分:25)

您可以在活动的onDestroy

中取消您的asynctask
@Override
protected void onDestroy() {
    asynctask.cancel(true);
    super.onDestroy();
}

并且在执行更改时,检查您的asynctask是否已被取消(活动被销毁)

protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);
    if(!isCancelled()) {
         gender.setText(values[0]);
    }
}

答案 1 :(得分:7)

我遇到了类似的问题 - 基本上我是在用户销毁片段后在异步任务中获得NPE。在研究Stack Overflow上的问题之后,我采用了以下解决方案:

volatile boolean running;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


public void onDestroy() {
    super.onDestroy();

    running=false;
    ...
}

然后,我在异步代码中定期检查“是否正在运行”。我有压力测试这个,我现在无法“打破”我的活动。这非常有效,并且比我在SO上看到的一些解决方案更简单。

答案 2 :(得分:3)

尝试

if (!isFinishing()) {
    gender.setText(values[0]);
}

答案 3 :(得分:1)

尽管如此,我从未遇到过这种情况;我会尽力回答你的问题。

在您的情况下,您需要验证传递给Context的{​​{1}}。

您可以执行验证

AsyncTask

优点是,如果活动在您到达此声明时被销毁,您的if(null!=mContext) //Activity still exist!! { gender.setText(values[0]); } else //Activity is destroyed { //Take appropriate action!! } 将自动变为Context,您可以处理该情景。

答案 4 :(得分:1)

我会坚持认为,如果您的Activity没有运行,为什么不取消AsyncTask? 那将是一个更好,更可行的解决方案。如果您正在运行应用程序,则说您从一个Activity移动到另一个Activity,那么它将不会给出错误AFAIK。

但是,我会坚持取消AsyncTask然后你的Activity没有运行,你可以检查AsyncTask是否正在运行,

if(task != null && task.equals(AsyncTask.Status.RUNNING))
task.cancel(true);

答案 5 :(得分:1)

作为 Android开发者的一项培训的this部分建议,在任务完成后需要更新的UI元素上保留WeakReference并检查参考在使用之前是null。这不仅有助于检查UI是否仍然存在,而且还不会阻止UI元素被垃圾回收。

答案 6 :(得分:1)

检查活动是否正在运行

 if (!isFinishing()) {
  // Do whatever you want to do
}

答案 7 :(得分:0)

不应该

if (gender) {
   gender.setText(values[0]);
}

够了吗?