我有一个基本上工作正常的片段。在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尚未完成时。当我等待它完成并返回时,一切都很好。
任何想法可能出错?
答案 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
}
}