我在调试Android应用程序时遇到一些问题,该应用程序在位图上运行一系列内存密集型操作。来自Google的Debugging tips,我知道
调试器和垃圾收集器目前是松散集成的。 VM保证调试器知道的任何对象在调试器断开连接之前不会被垃圾收集。在连接调试器时,这可能导致对象随时间累积。例如,如果调试器看到正在运行的线程,则即使在线程终止后,关联的Thread对象也不会被垃圾回收。
不幸的是,这意味着当我的应用程序在发布模式下运行良好时,任何在调试模式下运行的内存密集型线程都将被垃圾收集器忽略并被保留,因此越来越多的内存被用作越来越多的内存 - 密集线程被创建,导致应用程序崩溃,因为它无法分配所需的内存。
有没有办法明确告诉垃圾收集器应该收集这些线程,还是以其他方式解决这个问题?
答案 0 :(得分:0)
我最终通过产生AsyncTask
而不是Thread
来解决这个问题。垃圾收集器似乎更容易清除AsyncTasks,因此我能够在调试模式下运行应用程序而不会出现问题。
AsyncTask是产生后台操作的推荐方法。在后台完成的任何工作都应该放在任务的doInBackground(Params...)
方法中。 AsyncTasks通常用于在完成后在UI线程上执行操作,但您可以通过简单地将onPostExecute(Result)
方法留空或不存在来避免干扰UI线程。