Decode the file to Bitmap in Android throwing exception
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Android: Strange out of memory issue while loading an image to a Bitmap object
我开发了将文件解码为Bitmap的应用程序。 我完成了以下代码,但它总是抛出内存异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | private Bitmap decodeFile(File f) { Bitmap bmp = null; FileInputStream fis = null; try { // decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inTempStorage = new byte[16*1024]; o.inJustDecodeBounds = true; o.inPurgeable=true; //if(!f.exists()) f.createNewFile(); if(!f.exists()) f.createNewFile(); fis = new FileInputStream(f); BitmapFactory.decodeStream(fis, null, o); try { fis.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } fis = null; // Find the correct scale value. It should be the power of 2. final int REQUIRED_SIZE = 70; int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 1; while (true) { if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) break; width_tmp /= 2; height_tmp /= 2; scale *= 2; } // decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inTempStorage = new byte[16*1024]; o2.inSampleSize = scale; o2.inPurgeable=true; o2.inTempStorage = new byte[16*1024]; fis = new FileInputStream(f); bmp = BitmapFactory.decodeStream(fis); if (fis != null) fis.close(); fis = null; return bmp; // return BitmapFactory.decodeFile(f.getAbsolutePath(), o2); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { System.gc(); try { if (fis != null) fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } fis = null; } return null; } |
添加了日志猫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 12-03 12:03:05.070: E/AndroidRuntime(30696): FATAL EXCEPTION: main 12-03 12:03:05.070: E/AndroidRuntime(30696): java.lang.OutOfMemoryError 12-03 12:03:05.070: E/AndroidRuntime(30696): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 12-03 12:03:05.070: E/AndroidRuntime(30696): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527) 12-03 12:03:05.070: E/AndroidRuntime(30696): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:301) 12-03 12:03:05.070: E/AndroidRuntime(30696): at com.dexterity.iPinion.RootActivity.readFromSDCard(RootActivity.java:1984) 12-03 12:03:05.070: E/AndroidRuntime(30696): at com.dexterity.iPinion.RootActivity.setBrandingImage(RootActivity.java:285) 12-03 12:03:05.070: E/AndroidRuntime(30696): at com.dexterity.iPinion.RootActivity.access$0(RootActivity.java:252) 12-03 12:03:05.070: E/AndroidRuntime(30696): at com.dexterity.iPinion.RootActivity$1.handleMessage(RootActivity.java:515) 12-03 12:03:05.070: E/AndroidRuntime(30696): at android.os.Handler.dispatchMessage(Handler.java:99) 12-03 12:03:05.070: E/AndroidRuntime(30696): at android.os.Looper.loop(Looper.java:137) 12-03 12:03:05.070: E/AndroidRuntime(30696): at android.app.ActivityThread.main(ActivityThread.java:4745) 12-03 12:03:05.070: E/AndroidRuntime(30696): at java.lang.reflect.Method.invokeNative(Native Method) 12-03 12:03:05.070: E/AndroidRuntime(30696): at java.lang.reflect.Method.invoke(Method.java:511) 12-03 12:03:05.070: E/AndroidRuntime(30696): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 12-03 12:03:05.070: E/AndroidRuntime(30696): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 12-03 12:03:05.070: E/AndroidRuntime(30696): at dalvik.system.NativeStart.main(Native Method) |
Android内存非常低,约为14mb
要在您的应用中使用位图,请使用此链接,
官方android链接使用bitmpas
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
您正在设置BitmapFactory.Options但您没有将它们传递给BitmapFactory.decodeStream。
你有:
1 | BitmapFactory.decodeStream(fis); |
应该:
1 | BitmapFactory.decodeStream(fis, o2); |
另请阅读Android的显示位图
此外,根据您的设备,您可能只有很少的运行时内存。 对于24MB或更低的旧设备,尤其如此,大多数新设备为64MB或更多。 你可以查看
1 | Runtime.getRuntime().maxMemory() |
此外,您可以通过将"android:largeHeap ="true"'添加到AndroidManifest.xml文件来强制执行大堆。 在我的Galaxy Nexus上将我的堆推到254MB。