19

我已经AsyncTasks在我的应用程序中使用过,以便延迟下载和更新 UI。

现在我AsyncTasks简单地更新 UI:

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

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

如果没有,我会收到一个错误,我的应用程序将关闭。

4

8 回答 8

26

您可以在活动的 onDestroy 中取消您的异步任务

@Override
protected void onDestroy() {
    asynctask.cancel(true);
    super.onDestroy();
}

并在执行更改时检查您的异步任务是否已被取消(活动被破坏)

protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);
    if(!isCancelled()) {
         gender.setText(values[0]);
    }
}
于 2012-06-25T12:47:13.357 回答
9

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

volatile boolean running;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


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

    running=false;
    ...
}

然后,我在我的异步代码中定期检查“是否正在运行”。我已经对此进行了压力测试,现在我无法“破坏”我的活动。这完美地工作并且具有比我在 SO 上看到的一些解决方案更简单的优点。

于 2013-05-26T16:47:56.840 回答
4

尝试

if (!isFinishing()) {
    gender.setText(values[0]);
}
于 2012-06-25T12:56:55.340 回答
2

检查活动是否正在运行

 if (!isFinishing()) {
  // Do whatever you want to do
}
于 2016-03-05T07:43:21.873 回答
1

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

在您的情况下,您将需要验证Context传递给AsyncTask.

您可以执行验证

if(null!=mContext)  //Activity still exist!!
{
  gender.setText(values[0]);
}
else //Activity is destroyed
{
   //Take appropriate action!!
}  

好处是,如果活动在您到达此语句时被破坏,您Context将自动成为null并且您可以处理该场景。

于 2012-06-25T12:45:50.600 回答
1

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

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

if(task != null && task.equals(AsyncTask.Status.RUNNING))
task.cancel(true);
于 2012-06-25T12:49:16.167 回答
1

正如Android 开发人员培训的这一部分所建议的那样,在任务完成后需要更新的 UI 元素上保留一个,并在使用它之前检查引用是否存在。这不仅有助于检查 UI 是否仍然存在,而且不会阻止 UI 元素被垃圾收集。WeakReferencenull

于 2015-01-17T20:41:10.117 回答
0

不应该

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

足够?

于 2012-06-25T12:43:35.433 回答