我一直在尝试创建一个位图,用该位图创建一个画布,然后将它传递给imageView中的onDraw方法。在这个过程中,我注意到简单的应用程序泄漏了内存,因此减少了所有可能的代码,直到我得到了下面显示的内容。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
createImage(0,720,0,1280);
}
private void createImage(int l,int r,int t,int b){
//Create the bitmap that will be used to draw on
Bitmap.Config conf = Bitmap.Config.ARGB_8888; // see other conf types
Bitmap bmp = Bitmap.createBitmap(r-l,b-t, conf); // this creates a MUTABLE bitmap
bmp.recycle();
bmp = null;
}
}
可以看出,这段代码只是创建一个位图,并立即使其无效并回收它。尽管对位图一无所知,但它会在旋转变化时泄漏MainActivity。
现在,我怎么知道它的泄漏记忆而不仅仅是一个大图像?好吧,因为我在Eclipse中获得了很多堆转储,然后查看了MAT插件的直方图,并且一直说有800个MainActivity实例。尽管我等待几分钟才能确保系统从方向更改中销毁任何复制的对象。
这个漏洞发生在我的T-Mobile Galaxy S3(android 4.1.1)上,所以我在我的Galaxy Tab 2 10.1“(4.2.2)上尝试了完全相同的代码。奇怪的是,应用程序没有在选项卡上泄漏
这是我的问题,我没有正确使用createBitmap还是S3操作系统中存在一个大错误?
答案 0 :(得分:0)
对于任何降落在这里的人来说。经过几天的基本测试,无法更简化,保证没有泄漏,你好世界的例子,我得出结论,这个例子也没有泄漏。相反,这个例子只是创建一个1280 * 720图像,每像素4个字节(~3.7Mb),系统在旋转时销毁它 - 因此logcat中的GC_Concurrent消息。
我知道它并没有泄漏,因为我已经在Eclipse中查看了MAT,除了基本应用程序数据之外,唯一分配的内存大约是3.7Mb,与位图的大小完全相同。无论旋转设备的次数如何都是如此。
此外,MAT表示在首次旋转设备后的任何给定时间都有2-6个MainActivity对象。这就是为什么我认为这是泄漏的原因。但是,在任何给定时间只分配了1个图像,因此我认为在查看堆转储时,MAT的MainActivity对象数量是错误的。