0

我从资产中获取图像并分配给 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();
    }

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

4

5 回答 5

2

在你的 onDestroy 添加

   @Override
        public void onDestroy()
        {

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

            }
}

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

于 2012-09-22T16:06:22.003 回答
0

一旦检查这个

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

于 2012-09-22T15:37:20.590 回答
0

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

位图#recycle()

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

于 2012-09-22T16:16:10.127 回答
0

实际上,我正在使用一个由所有活动扩展的父活动,并且该活动已向 LocationListener 注册,因此 LocationListener 正在防止该活动被破坏。

于 2012-11-13T05:48:32.757 回答
0

In addition to what have been said I would close the asset stream because depending on the platform you are running on the asset might not be closed automatically. And even if it is you are keeping the file descriptor around for longer than you need it. It is a limited resource, so something else might went south as a result.

于 2020-08-17T22:37:21.390 回答