【问题标题】:Android AsyncTasks How to Check If activity is still runningAndroid AsyncTasks 如何检查活动是否仍在运行
【发布时间】:2012-06-25 12:40:23
【问题描述】:

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

现在我的AsyncTasks 更新 UI 真的很简单:

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

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

如果没有,我会收到错误消息并且我的应用程序将关闭。

【问题讨论】:

  • 不确定是否可以尝试使用 if(null==gender && gender.isShown() )

标签: android android-asynctask


【解决方案1】:

你可以在activity的onDestroy中取消你的asynctask

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

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

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

【讨论】:

【解决方案2】:

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

volatile boolean running;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


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

    running=false;
    ...
}

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

【讨论】:

【解决方案3】:

试试

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

【讨论】:

    【解决方案4】:

    检查activity是否正在运行

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

        在您的情况下,您需要验证传递给AsyncTaskContext

        您可以执行验证

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

        好处是,如果在你到达这个语句的时候activity被销毁了,你的Context会自动变成null,你可以处理这个场景。

        【讨论】:

        • 这行不通。因为您保持对活动的硬引用,所以它不会被清空。它将失效,但异步任务将继续保持对活动的引用。
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          不应该

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

          够了吗?

          【讨论】:

          • 你正在接受 (null==gender) 吗?即便如此,不仅如此,这还不够一段时间
          • 不,这还不够。活动可能已完成,但性别可能仍不为空,并且尝试引用它会失败,因为视图/窗口不再处于活动状态。
          猜你喜欢
          • 2011-07-23
          • 1970-01-01
          • 1970-01-01
          • 2012-12-07
          • 1970-01-01
          • 2012-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多