我有一个Fragment
通过一些助手Class
与互联网进行一些通信,需要一个接口来处理这样的异步回调:
SomeInternetCommunicator.getResource(theResourceToGet, retrieverInterfaceInstance);
界面如下所示:
public interface SomeInternetCommunicator {
void onResourceRetrieveSuccess(SomeResource resource);
void onResourceRetrieveFailed(CommunicatorException e);
}
问题在于,有时通话时间过长,用户已经在其他位置导航,而Fragment
调用的getResource
不再是当前正在运行的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似乎解释了一个更广泛但相关的情况,但它没有答案。
谢谢!
答案 0 :(得分:2)
这种情况有两种常用方法:
SomeInternetCommunicator
清除界面实例。类似的东西:
@Override public void onDestroyView(){
SomeInternetCommunicator.removeMe(this);
}
SomeInternetCommunicator
是编码不良的库而无法使用选项(1),则可以通过创建单独的类来实现接口来强制选项1。
public class SomeInternetCommunicatorInterceptor implements SomeInternetCommunicatorInterface {
private SomeInternetCommunicatorInterface listener;
public void setListener(SomeInternetCommunicatorInterface listener){
this.listener=listener;
}
@Override
public void onResourceRetrieveSuccess(SomeResource resource){
if(listener != null){
listener.onResourceRetrieveSuccess(resource);
}
}
@Override
public void onResourceRetrieveFailed(CommunicatorException e){
if(listener != null){
listener.onResourceRetrieveFailed(e);
}
}
}
然后在你的片段中使用这个新类:
private SomeInternetCommunicatorInterceptor interceptor;
public void onCreateView(....){
... your code
interceptor = new SomeInternetCommunicatorInterceptor();
}
onStart(){
interceptor.setListener(this);
}
onStop(){
interceptor.setListener(null);
}
public void onDestroyView(){
interceptor = null;
super.onDestroyView();
}
非常重要:
如果您将SomeInternetCommunicatorInterceptor
作为片段的内部类,则必须将其设为static class