我正在使用LoaderManager来处理支持列表视图的查询。它依赖于一些参数,这些参数直到过程的后期才知道。目前我打电话
getSupportLoaderManager().initLoader(0, null, callback);
在onCreate()中。在参数全部已知之前,这将立即创建加载器并执行查询。为了处理这个问题,我在onCreateLoader()中有一个虚拟查询,当时并非所有的参数都是已知的,并且我的回调处理程序中的一个标志在onLoadFinished()内检查我们是否有合法的查询。如果不是,我忽略了光标数据。当需要进行真正的查询时,我打电话给
getSupportLoaderManager().restartLoader(0, null, callback);
并将我的标志设置为true,以便onLoadFinshed()正确处理它。
我上面所做的似乎有点像哈克;有没有更好的办法?我最初尝试在我第一次需要查询时调用initLoader(),但是在方向更改时失败了,类似于this question。
答案 0 :(得分:0)
您可以先致电restartLoader
而不先致电initLoader
。只需从initLoader
移除onCreate
来电,并在有了参数后运行restartLoader
,无需标记。
答案 1 :(得分:0)
为了解决这个问题,对于我的用例,我能够依赖于使用每个片段的加载器管理器,在我需要它们并获得信息时实例化它们。如果这不适合其他人的用例,也许我的原始hack足够好,如果你想避免编写AsyncTasks并利用加载器的一些内置功能。</ p>
答案 2 :(得分:0)
我找到了另一个更简单的解决方案。出于某种原因,你必须在你的onCreate()中调用initLoader(),但是因为你每次调用restartLoader()时都必须传递LoaderCallbacks,所以你在第一次虚拟调用initLoader时使用的回调并不重要( )。我创建了非常简单的实用方法:
public static void initEmptyLoaders(Activity activity, int... ids) {
initEmptyLoaders(activity, activity.getLoaderManager(), ids);
}
public static void initEmptyLoaders(final Context ctx, LoaderManager loaderManager, int... ids) {
LoaderManager.LoaderCallbacks callbacks = new LoaderManager.LoaderCallbacks() {
@Override
public Loader onCreateLoader(int i, Bundle bundle) {
return new Loader(ctx);
}
@Override
public void onLoadFinished(Loader loader, Object o) {
}
@Override
public void onLoaderReset(Loader loader) {
}
};
for (int id : ids) {
loaderManager.initLoader(id, null, callbacks);
}
}
现在我在onCreate()中使用我后面可能需要的每个加载器ID调用initEmptyLoaders() - 一切正常: - )
答案 3 :(得分:0)
这是一个旧问题,但在某些机器人中仍然存在,并且支持库更新。然后使用android.support.v4.*
版本的Loader API来修复它。