多个异步任务未正确执行

时间:2012-12-04 07:23:18

标签: android android-asynctask

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

快乐的编码!

答案 1 :(得分:1)

您需要某种服务才能在用户切换后保持您的流程处于活动状态。一旦您的活动失去焦点,Android就可以完全关闭您的流程。或者你的活动。这两种情况都会导致问题,特别是如果您正在使用已关闭的活动的上下文。

正确的事情(tm)是实现服务,并将操作传递给服务以执行。

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

  • HttpConnection将与服务器的连接池连接起来,并对其进行限制 任何给定服务器的最大连接数到一些合理的 值。 4听起来不错。

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

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

但这是一个单独的问题。