Android -OutofMemory错误 - 位图工厂

S.S*_*nya 0 android

我的代码..

mImageView_Photos.setImageBitmap(BitmapFactory.decodeFile(picturePath));
Run Code Online (Sandbox Code Playgroud)

我的logcat ..

11-27 10:51:56.325: E/AndroidRuntime(3879): FATAL EXCEPTION: main
11-27 10:51:56.325: E/AndroidRuntime(3879): Process: com.virtualmaze.golfelite, PID: 3879
11-27 10:51:56.325: E/AndroidRuntime(3879): java.lang.OutOfMemoryError
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:620)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:376)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:402)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at com.virtualmaze.golfelite.HoleMapActivity.createImageView(HoleMapActivity.java:3839)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at com.virtualmaze.golfelite.HoleMapActivity.onActivityResult(HoleMapActivity.java:3762)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.app.Activity.dispatchActivityResult(Activity.java:5423)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3347)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3394)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.app.ActivityThread.access$1300(ActivityThread.java:135)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.os.Handler.dispatchMessage(Handler.java:102)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.os.Looper.loop(Looper.java:136)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at android.app.ActivityThread.main(ActivityThread.java:5001)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at java.lang.reflect.Method.invokeNative(Native Method)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at java.lang.reflect.Method.invoke(Method.java:515)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
11-27 10:51:56.325: E/AndroidRuntime(3879):     at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我怎么能纠正这个?

kir*_*hra 5

当图像大小很大时,它会显示java.lang.OutOfMemoryError

试试这个解决方案

1)您可以使用Android-Universal-Image-Loader Library高效地设置图像,这是一个非常好的解决方案

要么

2)您可以在使用之前缩小位图大小...

BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions);

int heightRatio = (int) Math.ceil(bmpFactoryOptions.outHeight / (float) height);
int widthRatio = (int) Math.ceil(bmpFactoryOptions.outWidth / (float) width);

if(heightRatio > 1 || widthRatio > 1)
{
    if(heightRatio > widthRatio)
    {
        bmpFactoryOptions.inSampleSize = heightRatio;
    }
    else
    {
        bmpFactoryOptions.inSampleSize = widthRatio;
    }
}

bmpFactoryOptions.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions);
Run Code Online (Sandbox Code Playgroud)