三星Galaxy S3中的位图“OutOfMemoryError”

时间:2013-10-14 08:51:16

标签: android bitmap out-of-memory

我已经更多地提到了我的问题。但我无法解决我的问题,我无法预测它在特定设备上发生的原因,尤其是Galaxy S3。我也在其他设备上运行相同的应用程序,它运行正常。我使用eclipse MAT发现了内存泄漏。它完全在我的应用程序上使用的图像编辑类中。我没有尝试过bitmap.recyle(),因为我在应用程序中使用了它。 ImageEditView类用于在屏幕上显示图像。我使用下面的代码片段加载了位图。

private Bitmap decodeAndDownsampleImageURI(Uri uri) {
    Bitmap bitmap = null;

    try {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        options.inPurgeable = true; 

        BufferedInputStream in = new BufferedInputStream(getContext().getContentResolver().openInputStream(uri));
        BitmapFactory.decodeStream(in, null, options);
        in.close();

        int scale = 1;
        if (options.outHeight > IMAGE_MAX_SIZE || options.outWidth > IMAGE_MAX_SIZE) {
            scale = (int) Math.pow(
                    2,
                    (int) Math.round(Math.log(IMAGE_MAX_SIZE / (double) Math.max(options.outHeight, options.outWidth))
                                        / Math.log(0.5)));
        }

        options = new BitmapFactory.Options();
        options.inSampleSize = scale;
        in = new BufferedInputStream(getContext().getContentResolver().openInputStream(uri));
        bitmap = BitmapFactory.decodeStream(in, null, options);
        in.close();
    } catch (FileNotFoundException e) {
        log.error(MyStyleApplication.hockeyAppLogMessage, e);
        Log.e(TAG, "decodeAndDownsampleImageUri()", e);
    } catch (Exception e) {
        log.error(MyStyleApplication.hockeyAppLogMessage, e);
        Log.e(TAG, "decodeAndDownsampleImageUri()", e);
    }

    return bitmap;
}

}

任何人请建议我提出更好的解决方案来解决我的问题。

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码。它将解决您的问题

BitmapFactory.Options options = new BitmapFactory.Options();
                                options.inSampleSize = 4;
 in = new BufferedInputStream(getContext().getContentResolver().openInputStream(uri));
    bitmap = BitmapFactory.decodeStream(in, null, options);

如果您仍然有问题,那么您可以缩小图像尺寸。

Bitmap newBmp=Bitmap.createScaledBitmap(bitmap , 100, 100, true);

答案 1 :(得分:0)

您无法将所有位图保存在内存中,这将耗尽内存。您必须将数据写入磁盘缓存。内存数据仅适用于当前屏幕或切换屏幕,例如在图库中向左或向右滑动图像。您的应用必须由某些活动驱动。因此,当某些事件触发时,有足够的时间从缓存中再次解码位图数据。