【问题标题】:Android AsyncTask not being called for minutes on ICS在 ICS 上几分钟没有调用 Android AsyncTask
【发布时间】:2012-06-15 13:44:36
【问题描述】:

我有一个使用大量 AsyncTasks 的应用程序,我遇到的问题是在我调用 execute 后的几分钟内没有启动一个特别重要的任务。

如果我将以下内容用于我的 ICS 设备,它可以工作;

if(Build.VERSION.SDK_INT >= 11)
{
  myTask.executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR, stuff );
}

与 pre-ICS 的情况相反;

myTask.execute(stuff);

我知道 ICS 已将线程执行更改为序列化,但我无法弄清楚是什么阻碍了线程队列。

在 Eclipse 中的调试中列出了大约 20 个线程,但我读到过,这可能是不正确的,因为调试器倾向于继续显示实际上并不存在的线程。

我如何确定哪些线程正在阻止序列化队列,这样我就不必从 ICS 上的默认值切换,甚至可能提高由于线程池执行器是默认行为。

【问题讨论】:

  • 请不要将我的英式英语改成美式英语,当然也不要添加更多的印刷错误。 :D
  • 启动所需的时间总是相同还是不同?
  • 它是多种多样的,有时它会立即执行,正如预期的那样,其他我将不得不等待几分钟。尽管似乎没有中间时间,但它要么是即时的,要么是 x(未计算的)分钟。

标签: android android-asynctask threadpool android-4.0-ice-cream-sandwich


【解决方案1】:

如何确定哪些线程占用了序列化队列

添加Log 语句以跟踪相关doInBackground() 方法的进入和退出。

甚至可能提高由于线程池执行器是默认行为而没有发现问题的前 ICS 设备的性能。

您不需要使用AsyncTask。只需 fork 自己的线程并使用 runOnUiThread() 之类的东西作为在主应用程序线程上执行逻辑的手段。 AsyncTask 是一种方便,而不是要求。而且,对于异常的高优先级任务,让您远离任何线程池争用可能更有意义。

或者,克隆并 fork AsyncTask 以使用 PriorityQueue,这样您就可以明确指出您的高优先级任务。

【讨论】:

  • 感谢 CW,我会对此进行测试。
  • 这当然帮助我找出原因,似乎我的一个 AsyncTasks 与 DefaultHttpClient 进行通信很长时间没有完成。我在这个客户端上设置了连接和套接字超时,所以无法弄清楚是什么阻碍了任务,超时时间很短,一两秒。此外,它似乎只在带有 ICS 4.0.3 的 HTC Sensation 上执行此操作,在 Galaxy S2 4.0.3 上进行测试工作正常。
猜你喜欢
  • 2012-05-19
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 2017-06-26
  • 2020-07-27
相关资源
最近更新 更多