12

我正在使用 Fragments 和 LoaderManager。我必须启动未知数量的任务,它们可能会并行运行(否则我只会重用一个且只有一个加载器)。例如,我有一个列表视图,每一行都可能有一个按钮来将该行的内容保存到网络服务器。用户可以对多个项目并行发起保存请求。

private int nextId = 0;

private void onClickListener() {
    Bundle bundle = new Bundle();
    bundle.putNextData(...);
    getLoaderManager().initLoader(nextId++, bundle, this);
}

我可以尝试自己记账,所以手动创建一个加载器池并在可能的情况下重用它们,看起来它可能已经由 API 实现了?

谢谢

4

3 回答 3

4

我认为您不应该使用 Loader 将数据保存到远程服务器。

相反,使用一个IntentService或类似的东西来处理一个“保存”操作队列。这样,您与 Web 服务器的通信可以被批处理、折叠(即单个项目的多个排队保存可以折叠到一个操作中),并且如果需要,将超出您的活动的生命周期。

IntentService(或等效)处理的保存队列也是使用退避重试失败操作的好方法,因为您可以使用AlarmManager.

于 2012-08-17T19:16:37.637 回答
1

IntentService 或绑定服务始终是解决此问题的好方法。正如 Roman 所指出的,请注意,不强烈建议将多个请求排入队列并分别调用它们(很有可能您在无线电连接上付出了很多工作 - 在使用数据时 - 这会耗尽您的电池。这里是必须的-阅读相关内容)

我个人建议使用具有请求队列和可用线程池的绑定服务(这种方法使您可以完全控制更复杂的网络操作,例如您的情况)。这里有关于方法的更多细节,这里有一个测试用例工作示例。

向我们更新您的进度。

于 2012-08-18T10:16:28.690 回答
0

你的方向是对的,让我帮你一点。

重用确实是一个好主意,你不必担心它,因为 Android 为你做了它(或者实际上是 Java ;)

它称为ThreadPoolExecuter,您可以根据需要启动任意数量的任务,他只会打开预定义数量的线程。(最佳实践是尝试打开尽可能多的线程,因为可以在设备上运行并行网络连接。根据我的研究,它是在 4 - 9 之间)。

如果您尝试两次下载相同的 URL,您可以保护自己并只为它打开一项任务。

于 2012-08-20T06:57:43.990 回答