android - 如何修复涉及线程的 Android 内存泄漏?

标签 android memory-leaks

所以我发现,使用 MAT,我不断地用每个 surfaceCreate

创建多个 Threads

虽然我认为我需要这些线程,但是当用户浏览我的应用程序时,此方法会导致 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);
    }
}

我五次打开游戏的 Career Activity 并导航离开,这就是 MAT 上显示的内容

leak

编辑:从那以后,我发现根据 surfaceDestroyed 来销毁我的线程是不可靠的。我现在从不同的方法调用适当的线程销毁调用,触发 onPause

最佳答案

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

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

关于android - 如何修复涉及线程的 Android 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14677913/

相关文章:

Android Scrollview 没有捕捉到长按

android - 免费的图表库,用于在 Android 中创建线条、条形图(堆叠和分组)和组合

java - 如何在android中使用jsoup自动登录网页?

java - 此代码中的 LDAP 连接泄漏

c++ - 谷歌模拟 : leaked mock object found at program exit?

c++ - 两个线程之间是否有内存泄漏(缓冲,清空)

c++ - 如何使用重载运算符修复此内存泄漏?

java - 比较两个街道地址或纬度经度数字

java - 我遇到了泄漏窗口的问题,该窗口最初是在 onDoInBackground 显示文件更新隐藏后添加到此处的

java - Android - 字符串缩短方法