Java Android位图/字节数组内存泄漏

Java Android位图/字节数组内存泄漏,java,android,memory-leaks,bitmap,Java,Android,Memory Leaks,Bitmap,我的android应用程序内存泄漏问题。根据我的hprof分析,它似乎是由SurfaceView类中的位图中的字节数组引起的 以下是对几个阵列之一的MAT分析: 以及违规类别的代码: public class AndroidFastRenderView extends SurfaceView implements Runnable { AndroidGame game; Bitmap framebuffer; Thread renderThread = null;

我的android应用程序内存泄漏问题。根据我的hprof分析,它似乎是由
SurfaceView
类中的
位图
中的
字节
数组引起的

以下是对几个阵列之一的MAT分析:

以及违规类别的代码:

public class AndroidFastRenderView extends SurfaceView implements Runnable {

    AndroidGame game;
    Bitmap framebuffer;
    Thread renderThread = null;
    SurfaceHolder holder;
    volatile boolean running = false;

    public AndroidFastRenderView(AndroidGame game, Bitmap framebuffer) {
        super(game);
        this.game = game;
        this.framebuffer = framebuffer;
        this.holder = getHolder();
        this.holder.setFormat(PixelFormat.RGBA_8888);
        setSystemUiVisibility(
                SYSTEM_UI_FLAG_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION);

    }

    public void resume() {
        setSystemUiVisibility(
                SYSTEM_UI_FLAG_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        running = true;
        renderThread = new Thread(this);
        renderThread.start();

    }

    public void run() {
        Rect dstRect = new Rect();
        long startTime = System.nanoTime();
        while (running) {
            if (!holder.getSurface().isValid())
                continue;
            float deltaTime = (System.nanoTime() - startTime) / 10000000.000f;
            startTime = System.nanoTime();
            game.getCurrentScreen().update(deltaTime);
            game.getCurrentScreen().paint(deltaTime);
            Canvas canvas = holder.lockCanvas();
            canvas.getClipBounds(dstRect);
            canvas.drawBitmap(framebuffer, null, dstRect, null);
            holder.unlockCanvasAndPost(canvas);

        }
    }

    public void pause() {
        running = false;
        while (true) {
            try {
                renderThread.join();
                break;
            } catch (InterruptedException e) {
            }
        }
    }

    public void release() {
        getHolder().getSurface().release();
        framebuffer.recycle();
    }
}
release()
在我的活动的
ondestory()中调用

frameBuffer
是使用以下行创建的:

Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth, frameBufferHeight, ARGB_8888);

在我的活动中。

确保您的线程“renderThread”已停止。如果仍处于活动状态,它将保留对“AndroidFastRenderView”对象的引用,因此无法释放内存…

帧缓冲区位图是否正在进行像素修改?还是每一帧都被创建为新的?提供的代码没有说明这一点。那么,帧缓冲区是否每帧都重新创建?@S.D.您是说需要在Activity类中进行更改?我在onCreate()方法的末尾尝试了循环使用,但这导致了一个异常,所以我将frameBuffer作为一个实例变量,并在onDestroy()中循环使用它。运行时未出错,但问题仍然存在。请在
Bitmap.createBitmap
行调试断点,并查看它在活动的生命周期中运行了多少次。是否重复运行?@S.D.只有在创建活动时才会触发断点。问题是每次创建活动时,当活动被销毁时,内存使用量都会跳跃,而内存不会减少。中断不应该被弃用:对此您很抱歉,但是
interrupt()
也没有解决问题
interrupt()
不会停止线程。您可以通过请求线程停止来停止线程,它通过从
run()
返回来停止线程。所有的
interrupt()。发布的代码中的
pause()
函数看起来不错——只要确保它确实被调用即可。