在Activity中将JPG作为背景会导致内存泄漏。

3
我的小应用在第五或第六次屏幕旋转后总是崩溃。定义了两个主要布局,一个用于横屏,一个用于竖屏。整天寻找内存泄漏问题后,我发现了问题所在:我将一张JPG作为Main-Activity的背景定义。将JPG更改为PNG后,内存问题得到解决。
背景被定义为drawable,并在main.xml中定义。
当我在2.2(模拟器)下测试应用时,没有出现问题,但在2.3.1(也是模拟器)下,应用崩溃了。
有人能重现这个问题吗?
现在我将我的应用程序减少到以下代码:
package at.memtest;

import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.widget.LinearLayout;

public class MemTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

@Override
protected void onDestroy() {
    recycleImages();
    super.onDestroy();

}

@Override
protected void onPause() {
    recycleImages();
    super.onPause();
}


private void recycleImages() {
    final LinearLayout theView = (LinearLayout) findViewById(R.id.main_layout);
    if (theView != null) {
        final BitmapDrawable background = (BitmapDrawable) theView.getBackground();
        if (background != null) {
            background.getBitmap().recycle();
        }
    }
}
}

现在,内存保持不变......

你能想象这是为了避免内存泄漏吗?

正如我上面所说的 - 我用作背景的图像是一个大小约为220K的PNG。


在OnPause和onDestroy中都调用了recycleImages函数,这不是重复调用了吗? - quinestor
3个回答

0

谢谢,但我已经读了好几遍了。我花了一天时间注释掉大部分程序代码。最后我做的是将JPG改为PNG,这样堆保持不变...我知道我的解决方案听起来有点奇怪,但在屏幕旋转(之前会导致问题)约100次后就不再崩溃了。 - Mike Mitterer
哦,伙计——你是对的。我又进行了一次测试:翻转方向大约15分钟左右,这意味着大约900个循环,然后它崩溃了。但是使用以下代码片段后,它已经翻转了大约2小时: - Mike Mitterer
哦,天啊 - 你是对的。我又做了一个测试:翻转方向15分钟,大约900个周期,它就崩溃了。但是使用以下代码片段,它已经翻转了大约2小时: @Override protected void onResume() { super.onResume(); System.gc(); }你能相信吗?现在堆保持相对稳定。你认为我的内存问题只是由模拟器引起的吗? - Mike Mitterer
我一直在处理大量图像的应用程序上工作,我可以向您保证这不仅仅是模拟器问题。将您的应用程序放到设备上后,请查看logcat,您会发现堆空间会不时地被重新调整大小。Android保证16MB的堆空间,但大多数实现会根据需要提供更多的空间。然而,有一个限制。一旦达到该限制,您将收到一个漂亮的OutOfMemoryError。此外,永远不要依赖System.gc()。 - zienkikk

0

我遇到了相同的问题。
我使用了 .png 而不是 .jpg,这解决了问题。


我也使用了png背景图片,但是我遇到了泄漏问题。所以仍然有麻烦。 - Lisitso

0

我在某些设备上使用jpg背景图片时遇到了极慢的应用程序问题。然而,使用png并没有解决我的问题。我认为这可能与我选择高压缩率以节省空间的图像有关,这可能导致运行时需要更多的解压缩工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接