【发布时间】:2016-08-04 08:33:05
【问题描述】:
我有一个Fragment,它通过一些帮助器Class 与互联网进行一些通信,它需要一个接口来处理这样的异步回调:
SomeInternetCommunicator.getResource(theResourceToGet, retrieverInterfaceInstance);
界面如下:
public interface SomeInternetCommunicator {
void onResourceRetrieveSuccess(SomeResource resource);
void onResourceRetrieveFailed(CommunicatorException e);
}
问题是,有时调用时间过长,用户已经导航到其他地方,并且调用 getResource 的 Fragment 不再是当前正在运行的 Activity 的一部分(不显示,不在回栈)。这会导致很多问题,因为这个孤儿 Fragment 仍在尝试对回调做出反应,即使它不再是 Activity 的一部分。例如,getContext() 返回 null。
现在我在Fragment 上的解决方法如下所示:
SomeInternetCommunicator flocktrackerTrackerRetrieverInterface = new SomeInternetCommunicator() {
@Override
public void onResourceRetrieveSuccess(SomeResource resource) {
if(isVisible()){
doRetrievalPostProcessing(resource);
}
}
@Override
void onResourceRetrieveFailed(CommunicatorException e) {
if(isVisible()){
doExceptionHandling();
}
}
};
使用isVisible() 有效,因为这样可以确保片段仍然在前台,是Activity 的一部分并准备好进行处理。但是,这并不能帮助我解决Fragment 不可见但仍然是当前Activity 的一部分的情况,这限制了我在显示之前加载Fragment 的可能性。 (Activity 在后台,Fragment 在 Backstack 上,Fragment 由 ViewPager 加载)。
在我进行后处理之前,有没有更好的方法来确保Fragment 仍然在当前Activity 的范围内?也许检查isAdded()?
This question 似乎解释了一个更广泛但相关的情况,但它没有答案。
谢谢!
【问题讨论】:
-
是的 isAdded() 是正确的。如果您想在添加和删除时执行更多操作,请覆盖 onAttach() 和 onDetach()。
标签: android android-fragments asynchronous