繁体   English   中英

片段未附加到活动,位于onResume中

[英]Fragment not attached to Activity, in onResume

我有一个片段,基本上可以正常工作。 在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

成功回调后,这将引发update ui方法。 我使用Square的改造来管理api调用。 再次,这只是在更新ui尚未完成时发生。 当我等待它完成并返回时,一切都很好。

任何想法可能有什么问题吗?

当您离开片段时,要么中止异步操作,要么在尝试更新UI时简单地检查一下片段是否仍与isAdded()相连。 如果未附加,请忽略结果,不要触摸视图。

第一个选项可能是最正确的,但也是最难实现的。 在我看来,第二种选择非常好,除非您在后台线程中执行了一些非常繁重且需要长时间运行的工作。

当我想要异步任务完成时:想象一下我的onPostExecute确实存储了接收到的数据,然后调用侦听器来更新视图,因此,为了提高效率,我希望任务仍然完成,以便在用户返回时我已经准备好数据。 在这种情况下,我通常这样做:

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

未连接到活动的片段MyFragment

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM