我可以在除背景之外的其他线程上运行异步任务

时间:2015-09-12 19:14:42

标签: android memory-management android-asynctask

我在设计的应用程序中有几个异步任务。有几次异步任务运行得非常慢。检查日志文件表明所需的后台操作实际上并未导致延迟。延迟是垃圾收集(davlvikvm)阻止后台线程。我不完全确定为什么我的应用程序中发生了太多GC,它不是特别记忆密集型(没有视频,只有基本列表和一些图像),并且MAT工具不具备显示任何令人震惊的记忆违规者。无论如何,我正在寻找一种解决方案来保持我的应用程序快速运行,以避免用户长时间的延迟。

我试图强制GC更早发生以避免它,但它仍然在这些不合时宜的时间运行。我的新想法是告诉异步任务在一个单独的独立线程上运行,这样它就不会被GC的状态所阻碍。这可能吗?还有更好的方法吗?

由于

1 个答案:

答案 0 :(得分:0)

我没有针对您的问题的具体解决方案,但不是,在不同的线程上运行您的工作负载不会改变GC期间应用程序的行为。

GC基本上会在整个VM正常工作时停止。 Dalvik垃圾收集器(自Gingerbread开始)旨在最大限度地缩短暂停时间,但它仍会停止整个VM。

有关详细信息,请参阅Does the DalvikVM Garbage Collector halt the whole VM?

就最小化GC暂停而言,不需要像您所描述的那样“内存密集”。通常,问题在于创建许多较小的对象。最小化GC暂停时间的方法是最小化您创建的垃圾量。

最小化垃圾创建的最佳方法是汇集(重复使用)对象而不是创建它们,丢弃引用(允许进行GC),然后创建另一个等等。

有关执行此操作的方法,请参阅,例如http://www.devahead.com/blog/2011/12/recycling-objects-in-android-with-an-object-pool-to-avoid-garbage-collection