推迟Loader管理的查询的最佳方法是什么?

时间:2012-04-04 22:09:25

标签: android

我正在使用LoaderManager来处理支持列表视图的查询。它依赖于一些参数,这些参数直到过程的后期才知道。目前我打电话

getSupportLoaderManager().initLoader(0, null, callback);
在onCreate()中

。在参数全部已知之前,这将立即创建加载器并执行查询。为了处理这个问题,我在onCreateLoader()中有一个虚拟查询,当时并非所有的参数都是已知的,并且我的回调处理程序中的一个标志在onLoadFinished()内检查我们是否有合法的查询。如果不是,我忽略了光标数据。当需要进行真正的查询时,我打电话给

getSupportLoaderManager().restartLoader(0, null, callback);

并将我的标志设置为true,以便onLoadFinshed()正确处理它。

我上面所做的似乎有点像哈克;有没有更好的办法?我最初尝试在我第一次需要查询时调用initLoader(),但是在方向更改时失败了,类似于this question

4 个答案:

答案 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来修复它。