我在试着找出我是不是在Loaders方面做错了什么。我使用的是支持库,并且我有一个片段,它在onCreate()中调用initLoader()并将自身设置为LoaderCallbacks,但是它在onLoadFinished()中循环接收两次结果,一次是调用init (并且它已经拥有数据)的结果,另一次是FragmentActivity循环遍历onStart()中的所有Loader并传递结果的结果,因为它已经拥有数据。
如果我只调用一次init (在第一次启动片段时),它不会将自身设置为Loader的回调函数,因此它根本不会接收到对onLoadFinished的调用。似乎onLoadFinished应该只调用一次,因为一些开销很大的事情可能会在onLoadFinished()中完成(比如清除列表适配器等),所以我只是想弄清楚这是不是一个bug,或者我只是在错误的时间或其他什么地方调用了init。
有人对这个问题有什么见解吗?
发布于 2015-05-28 13:55:37
我遇到了类似的问题,原因是我的代码中包含了initLoader
和restartLoader
。根据用户的操作,我的查询可能会改变,所以我需要重新启动我的加载器。
解决方案是只使用restartLoader
,即使在onResume
回调方法中也是如此,用restartLoader
替换initLoader
。
发布于 2015-11-30 05:41:29
这是一个相当古老的问题,但对于未来的读者,我有一个替代的解决方案。基本上,我最终所做的就是重新启动加载程序。
public void onActivityCreated(Bundle savedInstanceState) {
...
if(getLoaderManager().getLoader(Constants.LOADER_ID) == null) {
getLoaderManager().initLoader(Constants.LOADER_ID, null, this);
} else {
getLoaderManager().restartLoader(Constants.LOADER_ID, null, this);
}
...
}
这解决了我的问题,在屏幕上旋转加载程序被触发两次。还有一件事需要注意的是,我只需要在我测试的Android <6上使用它。Android 6似乎完全没有这个问题。
发布于 2013-02-14 18:25:51
我自己也遇到了同样的问题,没有好的解决方案。这似乎是安卓框架中的bug,这里有一个类似的线程,提出的解决方案是将initLoader()放在onResume()中-我试过了,它起作用了,在onLoadFinished()上只被调用一次:Android: LoaderCallbacks.OnLoadFinished called twice
https://stackoverflow.com/questions/14719814
复制相似问题