片段未附加到onResume上的Activity

时间:2014-03-10 07:35:56

标签: java android android-fragments retrofit

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

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

    //in pseudo
    do async call 
       success callback
          update ui

       failure callback
          update ui
}

大部分时间都可以正常使用。但是,在更新ui方法完成之前,当用户导航回父活动时,我遇到了问题。更新ui只是设置了一些文本视图。

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

  

致命的例外:主要       处理:com.project.foobar,PID:4405       java.lang.IllegalStateException:片段MyDetailFragment {41ebb478}未附加到Activity

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

任何想法可能出错?

2 个答案:

答案 0 :(得分:6)

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

第一个选项可能是最正确但也是最难实现的选项。 第二种选择在我看来完全没问题,除非你在后台线程中做了一些非常繁重且经常运行的东西。

答案 1 :(得分:0)

当我希望异步任务完成时:假设我的onPostExecute确实存储了收到的数据,然后调用一个监听器来更新视图,因此为了更高效,我希望任务完成所以我有用户回来时准备好数据。在这种情况下,我通常这样做:

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

Fragment MyFragment not attached to Activity