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

标签 java android memory-leaks bitmap

我的 Android 应用程序遇到内存泄漏问题。根据我的 hprof 分析,它似乎是由来自 SurfaceView 类中的 Bitmapbyte 数组引起的。

以下是几个数组之一的 MAT 分析:

MAT Analysis

以及有问题的类的代码:

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() 在我的 Activity 的 onDestroy() 中调用。

frameBuffer 使用以下行创建:

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

在我的 Activity 中。

最佳答案

确保您的线程“renderThread”已停止。如果它仍然处于 Activity 状态,则它持有对“AndroidFastRenderView”对象的引用,因此它无法释放内存...

关于java - Android 位图/字节数组内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33771946/

相关文章:

java - ICS Spinner ("drop-down"而不是对话框)在旧的 Android 版本中

java - Cassandra Hadoop MapReduce : java. lang.ClassCastException : java. util.HashMap 无法转换为 java.nio.ByteBuffer

java - 无法显示 fragment ,找不到 ID 的 View

android - 如何从移动存储中查看pdf文件并通过动态 ListView 一致列出名称

android - picasso 清晰的内存

iphone - 使用 ALAssetsLibrary 时出现内存泄漏

java - 在 Tomcat 中重新部署应用程序时发生内存泄漏

java - ArrayList 未在 onChildAdded 函数内更新

java - Web 应用的更新中心和数据库变更管理

android - 滚动时GridView的列不是直线