3

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

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

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

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

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

我在上面所做的似乎有点老套;有没有更好的办法?我最初试图稍后调用 initLoader(),当我第一次需要查询时,但是在方向更改时事情会失败,类似于这个问题

4

4 回答 4

0

您可以简单地调用restartLoader而无需initLoader先调用。只需initLoader从 中删除调用onCreate,并在restartLoader获得参数后运行,不需要标志。

于 2012-04-05T01:18:09.700 回答
0

只是为了结束这个问题,对于我的用例,我能够依靠使用每个片段加载器管理器,在我需要它们并获得信息时实例化它们。如果这不适合其他任何人的用例,如果您想避免编写 AsyncTasks 并利用加载程序的一些内置功能,那么我最初的 hack 可能已经足够好了。

于 2012-04-17T06:50:34.350 回答
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() 中调用 initEmptyLoaders() 以及我以后可能需要的每个加载器 id - 一切正常:-)

于 2013-01-17T08:04:16.707 回答
0

这是一个老问题,在某些机器人中仍然存在,并且支持库更新得更多。然后使用android.support.v4.*Loader API 的版本来修复它。

于 2013-12-05T07:59:39.433 回答