2011-08-10 50 views
2

我有一个Android应用程序,它具有主UI线程,和我一直在使用的AsyncTask催生了其他几个工作线程。的AsyncTask不执行时task.execute()被调用

但是,有一种情况是我每次都可以生成一个场景,在这个场景中,我尝试使用task.execute()生成一个带有ASyncTask的新线程,并且它不调用doInBackground()。线程似乎从未开始。然后我的应用程序似乎旋转了一会儿,然后开始挂起。

下面是我使用的线程: enter image description here

,这里是设备上的内存使用情况:

enter image description here

它没有看起来好像它未能由于产卵内存问题。

是否有其他的一些潜在原因,我不知道的?最大线程数?有什么办法让我找出它为什么没有执行?

+0

显示为您的代码,以便我们可以帮助您解决问题... – Dinash

+0

我有上千行的代码...代码的主要相关行是任务实例化和task.execute()...一切否则在那里可能有太多可以展示和解释。我正在寻找更高级别的指导。 – gnychis

回答

4

的AsyncTask使用为5的芯池大小和LinkedBlockingQueue内部使用一个ThreadPoolExecutor。简单来说,您最多可以同时激活5个AsyncTasks。其他任务将排队,直到其他AsyncTasks之一不从doInBackground()返回。

你可以查看你的代码来释放一些AsyncTasks。如果这是不可能的,你可以尝试在你的项目中创建一个CustomAsyncTask类,它基于原始的AsyncTask代码,可以找到here。尝试将CORE_POOL_SIZE变量设置为更高的值或使用SynchronousQueue

1

您是否阅读过文档?

注:此功能安排在队列中的任务单 后台线程或取决于平台 版本的线程池。当第一次引入时,AsyncTasks在单个后台线程上连续执行。从DONUT开始,将其更改为 线程池,允许多个任务并行操作。 蜂窝之后,计划改变这种回单个线程到 避免因并行执行常见的应用错误。如果您 真正想要并行执行,你可以使用 executeOnExecutor(执行器,参数...)此方法 THREAD_POOL_EXECUTOR的版本;不过,请参阅其中的注释,其中使用 的警告。

Source

+0

感谢您指出了这一点。不知何故,我一味地错过了这一点。我使用Android 2.2.2,所以我应该有一个线程池。因此,不应该我的ASyncTask并行操作而不是执行阻塞操作? (这意味着,我不需要使用executeOnExecutor) – gnychis

相关问题