Android内存泄漏与资产图像

时间:2012-09-22 15:33:02

标签: java android memory-leaks

我从资源获取图像并分配给imageView,一切正常但是当我看到堆内存大小时它会一次又一次地加载同一页面时不断增长,下面是我用来从中获取图像的代码资产文件夹。

private Bitmap getBitmapFromAsset(String strName) throws IOException
{
    AssetManager assetManager = getAssets();

    InputStream istr = assetManager.open(strName);
    Bitmap bitmap = BitmapFactory.decodeStream(istr);

    return bitmap;
}

    //Code to assign bitmap to imageview
    ImageView itemImage = (ImageView) findViewById(R.id.itemImage);
    try {
        Bitmap bm = getBitmapFromAsset("full/" + Uri.parse(menuItem.getFullImage()).getLastPathSegment());
        itemImage.setImageBitmap(bm);
    } catch (IOException e) {
        e.printStackTrace();
    }

这就是我正在做的事情,有什么地方我需要回收位图吗?

5 个答案:

答案 0 :(得分:2)

在你的onDestroy add

   @Override
        public void onDestroy()
        {

            super.onDestroy();
            if(bm != null)
            {
                bm.recycle();

            }
}

另外进行内存转储并分析转储使用MAT。如果您需要帮助,请参阅此视频tutorial

答案 1 :(得分:0)

检查一下

完成位图使用后,使用以下语句bm = null; 并写System.gc();在ondestroy()中(如果需要在onPause()中)并查看是否有效

答案 2 :(得分:0)

Bitmap对象一旦使用,您需要调用recycle()方法来释放本机资源。

Bitmap#recycle()

  

释放与此位图关联的本机对象,并清除对像素数据的引用。这不会同步释放像素数据;如果没有其他引用,它只是允许它被垃圾收集。位图标记为“死”,这意味着如果调用getPixels()或setPixels(),它将抛出异常,并且不会绘制任何内容。此操作无法撤消,因此只有在您确定位图没有进一步用途时才应调用此操作。这是一个高级调用,通常不需要调用,因为正常的GC进程将在没有更多对此位图的引用时释放此内存。

答案 3 :(得分:0)

实际上我正在使用由所有活动扩展的父活动,并且该活动已在LocationListener中注册,因此LocationListener阻止活动销毁。

答案 4 :(得分:0)

除了我所说的,我将关闭资产流,因为根据资产上运行的平台的不同,可能不会自动关闭资产。 即使是这样,您也可以将文件描述符保留的时间超过所需的时间。这是一种有限的资源,因此可能会导致其他问题。