我的 Android 应用程序遇到内存泄漏问题。根据我的 hprof 分析,它似乎是由来自 SurfaceView
类中的 Bitmap
的 byte
数组引起的。
以下是几个数组之一的 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()
在我的 Activity 的 onDestroy()
中调用。
frameBuffer
使用以下行创建:
Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth, frameBufferHeight, ARGB_8888);
在我的 Activity 中。
最佳答案
确保您的线程“renderThread”已停止。如果它仍然处于 Activity 状态,则它持有对“AndroidFastRenderView”对象的引用,因此它无法释放内存...
关于java - Android 位图/字节数组内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33771946/