如何修复涉及Threads的Android内存泄漏?

Hou*_*man 8 android memory-leaks

所以我发现,与MAT我保持创建多个ThreadssurfaceCreate

我认为我需要这些线程,但是这个方法导致多个实例ViewThread,当用户浏览我的应用程序时,这是一个内存泄漏.

如何重新组织我的线程的创建和处理方式,以便不会发生这种情况,或者如何阻止泄漏的发生?

@Override
public void surfaceCreated(SurfaceHolder holder) {
    loading=false;
    if (!mThread.isAlive()){
        mThread = new ViewThread(this);
        mThread.setMenuRunning(true);
        mThread.start();
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

    if (mThread.isAlive()){ 
        mThread.setMenuRunning(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

我打开并远离Career我的游戏活动五次,这就是出现在MAT

泄漏

编辑:我已经发现,依赖于surfaceDestroyed我的线程的破坏是不可靠的.我现在调用来自不同方法的相应线程销毁调用,触发onPause.

nic*_*980 4

您应该使用 Wea​​kReference 来引用线程中的职业。这样,当不再有对职业的硬引用时,引用将被清除。

您可以通过右键单击职业并选择“GC 根路径”,然后选择所有引用来跟踪 MAT 中的所有引用。这将向您显示内存中保留的对象的路径。确保在完成活动后清除这些引用,或者使用 Wea​​kReferences 让 GC 自动清除它们。