我有一个使用大量AsyncTasks的应用程序,我遇到的问题是,在调用execute之后,一个特别重要的任务在几分钟内没有启动。
如果我将以下内容用于我的ICS设备,则可以正常使用;
if(Build.VERSION.SDK_INT >= 11)
{
myTask.executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR, stuff );
}
而不是在ICS之前;
myTask.execute(stuff);
我知道ICS已将线程执行更改为序列化但我无法弄清楚是什么阻碍了线程队列。
在eclipse中调试中列出了大约20个线程,但是我已经读过,或许这是不正确的,因为调试器往往会继续显示那些不存在的线程。
我如何确定哪些线程正在阻止序列化队列,因此我不必从ICS上的默认值切换,甚至可能提高ICS设备的性能,因为它们没有看到由于线程池执行程序是默认行为。
答案 0 :(得分:3)
如何确定哪些线程正在阻止序列化队列
添加Log
语句以跟踪相关doInBackground()
方法的进入和退出。
甚至可能提高预先ICS设备的性能,因为线程池执行器是默认行为而无法看到问题。
您无需使用AsyncTask
。只需分叉您自己的线程并使用runOnUiThread()
之类的东西作为在主应用程序线程上执行逻辑的方法。 AsyncTask
是一种便利,而非要求。并且,对于异常值高优先级的任务,您可以更有意义地将其远离任何线程池争用。
或者,克隆并分叉AsyncTask
以使用PriorityQueue
,这样您就可以明确指出您的高优先级任务。