4

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

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

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

与 pre-ICS 不同;

myTask.execute(stuff);

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

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

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

4

1 回答 1

3

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

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

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

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

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

于 2012-06-12T17:15:09.647 回答