我正在使用Fragments和LoaderManager。我必须启动未知数量的任务,它们可能并行运行(否则我只重用一个且只有一个加载器)。例如,我有一个listview,每行可能有一个按钮,用于将该行的内容保存到Web服务器。用户可以并行发起多个项目的保存请求。
private int nextId = 0;
private void onClickListener() {
Bundle bundle = new Bundle();
bundle.putNextData(...);
getLoaderManager().initLoader(nextId++, bundle, this);
}
我自己可以尝试簿记,所以手动创建一个加载器池并在可能的情况下重用它们,看起来它可能已经由API实现了吗?
由于
答案 0 :(得分:4)
我认为您不应该使用Loader将数据保存到远程服务器。
相反,使用IntentService
或类似的东西来处理“保存”操作的队列。这样,您与Web服务器的通信可以进行批处理,折叠(即单个项目的多个排队保存可以折叠为一个操作),并且如果需要,它将超出您活动的生命周期。
由IntentService
(或等效的)处理的保存队列也是使用退避重试失败操作的好方法,因为您可以使用AlarmManager
实现具有指数退避的延迟重试。
答案 1 :(得分:1)
IntentService或绑定服务总是很好的方法。 正如Roman指出的那样,请注意不要强烈推荐将多个请求排队并单独调用它们(很可能你在无线电连接上给了很多工作 - 当使用数据时 - 除其他外还要耗尽你的电池。这里是{{ 3}}关于那个)
我个人建议使用带有请求队列和可用线程池的绑定服务(这种方法可以让您完全控制更复杂的网络操作,例如您的情况)。有关方法must-read和here上的测试用例工作示例的详细信息。
向我们介绍您的进度。
答案 2 :(得分:0)
你是正确的方向,让我帮你一点。
重用确实是一个好主意,你不必担心它,因为Android为你做了(或实际上是Java);
它调用了ThreadPoolExecuter,您可以根据需要启动任意数量的任务,并且只打开预定义数量的线程。(最佳做法是尝试打开尽可能多的线程,因为并行网络连接可以在从我的研究来看,这是在4 - 9之间。
如果您尝试两次下载相同的网址,则可以保护自己并仅为其打开一项任务。