通过uri将图像设置为imageView时出现OOM [英] OOM comes up when setting image to imageView by the uri

查看:80
本文介绍了通过uri将图像设置为imageView时出现OOM的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经将图像保存到文件中,并且当我想读取文件并将图像设置为imageView时,我遇到了OOM异常.

I have saved an image to a file and when I want to read the file and set the image to the imageView , I face with OOM exception.

这是我的代码:

File tempImageFile = new File(Environment.getExternalStorageDirectory().getPath()
                + "/AHOORATempImage");

        FileOutputStream fileOutputStream = new FileOutputStream(tempImageFile);
        fileOutputStream.write(data);
        fileOutputStream.flush();
        fileOutputStream.close();
        
        imageView.setImageURI(Uri.fromFile(tempImageFile));

这是logCat错误的一部分:

and This is part of error in logCat :

java.lang.OutOfMemoryError: Failed to allocate a 7680012 byte allocation with 2074372 free bytes and 2025KB until OOM
    at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
    at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:677)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:653)
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:486)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:993)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:959)
    at android.graphics.drawable.Drawable.createFromStream(Drawable.java:945)
    at android.widget.ImageView.resolveUri(ImageView.java:769)
    at android.widget.ImageView.setImageURI(ImageView.java:429)
    at androidx.appcompat.widget.AppCompatImageView.setImageURI(AppCompatImageView.java:120)
    at com.jsibbold.zoomage.ZoomageView.setImageURI(ZoomageView.java:395)
    at com.apd.atxhider.allGalleryOpenImage.onCreate(allGalleryOpenImage.java:57)
    at android.app.Activity.performCreate(Activity.java:6100)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2468)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2601)
    at android.app.ActivityThread.access$800(ActivityThread.java:178)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
    at android.os.Handler.dispatchMessage(Handler.java:111)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5637)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

谢谢!

推荐答案

如果图像很大,则可以将BitmapFactory与选项一起使用.

If the image is big, you could use BitmapFactory with options.

请参考以下网址.

https://developer.android.com/topic/performance/graphics/load-bitmap

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 = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

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

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

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

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


String filePath = tempImageFile.getAbsolutePath();
imageView.setImageBitmap(decodeSampledBitmapFromResource(filePath, 100, 100));

这篇关于通过uri将图像设置为imageView时出现OOM的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆