1

我有一个基本上可以正常工作的片段。在 onResume 方法中,当用户访问活动/片段时,我执行 api 调用以获取新数据。

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

    //in pseudo
    do async call 
       success callback
          update ui

       failure callback
          update ui
}

这在大多数情况下都可以正常工作。但是,当用户在更新 ui 方法完成之前导航回父活动时,我遇到了一个问题。更新 ui 只是设置了一些文本视图。

例如,当用户导航到活动和片段时,上面的 onResume 被调用。用户立即返回父活动。异步调用和更新 ui 尚未完成,我得到:

致命异常:主进程:com.project.foobar,PID:4405 java.lang.IllegalStateException:片段 MyDetailFragment{41ebb478} 未附加到 Activity

这是在成功回调后在更新 ui 方法中抛出的。我使用 square 的改造来管理 api 调用。同样,这只是在更新 ui 尚未完成时发生。当我等待它完成并返回时,一切都很好。

有什么想法可能是错的吗?

4

2 回答 2

6

当您离开片段时中止异步操作,或者isAdded()在您尝试更新 UI 时检查片段是否仍然附加。如果它没有附加,则忽略结果并且不要触摸视图。

第一个选项可能是最正确的,但也是最难实现的。在我看来,第二个选项非常好,除非你在后台线程中做一些非常繁重和长时间运行的事情。

于 2014-03-10T07:43:58.083 回答
0

当我希望异步任务无论如何都完成时:想象我onPostExecute确实存储接收到的数据,然后调用一个监听器来更新视图,所以为了提高效率,我希望任务无论如何完成,这样当用户回来时我就可以准备好数据。在这种情况下,我通常会这样做:

@Override
protected void onPostExecute(void result) {
// do whatever you do to save data
  if (this.getView() != null) {
      // update views
  }
}

片段 MyFragment 未附加到 Activity

于 2014-03-10T08:21:02.447 回答