【问题标题】:Can I have Async task run on different thread other than background我可以让异步任务在后台以外的不同线程上运行吗
【发布时间】:2015-09-13 06:38:11
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: android memory-management android-asynctask


    【解决方案1】:

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

    GC 实质上会在整个 VM 工作时停止它。 Dalvik 垃圾收集器(自 Gingerbread 以来)旨在最大限度地减少暂停时间,但它仍会停止整个 VM。

    更多细节请见Does the DalvikVM Garbage Collector halt the whole VM?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多