我有 ListFragment 和 AsyncTaskLoader ,它从互联网上获取数据。 ListFragment 由 BaseAdapter 填充。
加载数据时, BaseAdapter 会使用旋转进度条填充第一行。加载数据且未发生错误时,数据将填入 ListView 。但是如果发生了一些错误(我在 AsyncTaskLoader 中有一个标志指示该错误),那么 BaseAdapter 会在第一行填充错误消息。
问题:
加载出错时, LoaderManager 会自动尝试再次加载数据(forceLoad()
已调用),这很好。但我需要通知 BaseAdapter 数据正在加载,因此 BaseAdapter 可以将错误消息更改为旋转进度条。
当 LoaderManager 正在调用forceLoad()
时,是否有任何简单的方法来通知片段?
我的建议:
ListFragment将实现下面的接口,并在AsyncTaskLoader的构造函数中传递此ListFragment。
public interface LoadingListener {
public void onLoadingStatusChanged(boolean isLoading);
}
然后我可以在onLoadingStatusChanged(true)
和loadInBackground()
onLoadingStatusChanged(false)
中拨打deliverResult(T data)
。我很害怕在AsyncTaskLoader中保留对Fragment的引用可能会泄漏该片段。
答案 0 :(得分:0)
您建议的实施是处理事情的好方法。虽然Loader
已经为OnLoadComplete
和OnLoadCanceled
提供了回调,但启动回调是您需要进行的唯一补充。您还可以实现自定义OnLoadStart
回调,该回调会随时调用onForceLoad()
或onStartLoad()
,而不是loadInBackground
,并且会更接近现有框架回调的镜像。
我建议,就像框架回调一样,你设置注册和取消注册监听器的方法而不是在构造函数中传递它,所以你的Fragment可以作为正常生命周期的一部分附加/删除自己,并且引用不会不要泄漏。正如您所提到的,在构造函数中传递它而无法将其删除将被视为泄漏。