OutOfMemoryError使用位图setImageUri

可能重复:
Android:将图像加载到Bitmap对象时出现内存不足的问题
OutOfMemoryError:位图大小超过虚拟机预算: - Android

我有一个应用程序,用户可以在图库中使用已经存在的图片或图片,并在将新闻保存到数据库(我只保存图片路径内容:/ / ...)后附加到新闻中,然后显示包含图像标题和日期的ListView中的所有新闻。 在适配器中显示图像我正在使用以下内容:

...

image.setImageURI(null);
System.gc();            
image.setImageURI(Uri.parse(noticia.getIMAGEM()));

...

但是即使使用System.gc(); 每个新图像都被加载

12-12 14:59:37.239:E / AndroidRuntime(4997):java.lang.OutOfMemoryError:位图大小超过执行者VM预算

也已经尝试过使用

image.setImageURI(null);
System.gc();  

在onResume(),onPause(),onDestroy()中,但没有任何工作。

也读过这篇文章:[链接] [1]

if(!((BitmapDrawable)image.getDrawable()).getBitmap().isRecycled()){
                ((BitmapDrawable)image.getDrawable()).getBitmap().recycle();
            }
            Bitmap thumbnail = null;
            try {
                thumbnail = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse(img));
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             image.setImageBitmap(thumbnail); 

但后来我得到以下错误:

12-12 15:28:42.879:E / AndroidRuntime(5296):java.lang.RuntimeException:Canvas:尝试使用回收的位图android.graphics.Bitmap@40756520

除此之外,当我的列表视图上下滚动它不断崩溃,我相信它正在请求图像..

我不知道还有什么可以做的,有什么建议吗?

编辑:

我在这个问题的同一个解决方案中发现了另一篇文章,但是我相信它会需要图像的缓存,因为在列表中向上或向下滚动列表时,这对用户体验来说是非常糟糕的。 任何想法解决?

下面的代码:

在适配器中:...

String imagePath = getPath(Uri.parse(img));
image.setImageBitmap(decodeSampledBitmapFromResource(imagePath, 85, 85));

...

方法:

public String getPath(Uri uri)  
    { 
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        return cursor.getString(idx);
    } 

    public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 2;

    if (height > reqHeight || width > reqWidth) {
        if (width > height) {
            inSampleSize = Math.round((float)height / (float)reqHeight);
        } else {
            inSampleSize = Math.round((float)width / (float)reqWidth);
        }
    }
    return inSampleSize;

    }

    public static Bitmap decodeSampledBitmapFromResource(String resId,
            int reqWidth, int reqHeight) {

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(resId, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(resId, options);
    }

这听起来像你想从本地画廊缩略图。 有一个由SDK直接提供的更好的解决方案:

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        Bitmap thumbnail = Thumbnails.getThumbnail(context.getContentResolver(), /*ID of the local item*/, Thumbnails.MINI_KIND, options);
        // Calculate inSampleSize
        options.inSampleSize = UIUtils.calculateInSampleSize(options, reqWidth, reqHeight);
        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        thumbnail = Thumbnails.getThumbnail(context.getContentResolver(), /*ID of the local item*/, Thumbnails.MINI_KIND, options);
链接地址: http://www.djcxy.com/p/93097.html

上一篇: OutOfMemoryError using bitmap setImageUri

下一篇: Android ListView: out of memory exception