0

我试图在onCreate()活动中一次启动 6 个异步任务。但我注意到以下内容:

a)如果我保持相同的活动,所有异步任务都会doInBackground()正确执行。

b)如果我切换到其他活动,则只会doInBackground()执行 4 或 5 个异步任务。最后一个async任务doInBackground()永远不会执行。

有人可以告诉我可能做错了什么。我在 for 循环中盯着不同的异步任务。如果我在 onStart() 中执行此操作,那么如果我切换到此活动,则所有异步任务都会再次执行。请帮忙。这是示例代码:

For(int i=0;i<7;i++){
webServiceTask= WebServiceTask.getInstance();
webServiceTask.execute("");
}
4

2 回答 2

2

也许您应该考虑以下几点:

  • WebServiceTask 是否检索任何值得保留的信息(即不是很不稳定,用户反复请求相同数据的风险很高):在这种情况下,您可以将您的工作卸载到(意图)服务并传达通过 ResultReceiver 或 ContentProvider(仅举几例)将结果返回到您的应用程序。
  • 如果周围没有活动或服务来保持应用程序的进程处于活动状态,则不能保证 AsyncTasks 运行完成。
  • 如果 WebServiceTask 一个接一个地运行是可以的,那么您也可以更改您的代码以仅使用一个顺序执行这些任务的 AsyncTask。你甚至可以考虑实现 AsyncTask 的进度报告机制。
  • 如果 AsyncTask(s) 执行的操作在 Activity 关闭后没有任何意义,请务必在 onStop() 或 onPause() 生命周期方法中 .cancel() 取消它们。
  • 请记住 Ed Rowland 的回答的第 3 条,我也在我之前对您的问题的评论中发布了它。

快乐编码!

于 2012-12-04T09:44:40.067 回答
1

在用户切换后,您需要某种服务来保持您的进程处于活动状态。一旦你的活动失去焦点,Android 可以完全关闭你的进程。或您的活动。两者都会导致问题,尤其是当您使用已关闭的 Activity 的上下文时。

The Right Thing to Do (tm) 是实现一个服务,并将操作传递给服务执行。

只有四个任务同时运行的原因有很多。在我的头顶上:

  • HttpConnection 汇集到服务器的连接,并将任何给定服务器的最大连接数限制为某个合理的值。4听起来差不多。

  • 您的目标服务器正在限制同时连接的数量。

  • 你的线程池没有你想象的那么大。启动 API 16(我认为)默认线程池大小是一个线程!(!!) 理由:显然,Android OS 开发人员已经厌倦了 Android 应用程序开发人员的线程错误。您的任务是否有可能连续执行?这或多或少符合您描述的症状。

但这是一个单独的问题。

于 2012-12-04T09:18:43.603 回答