android如何处理内存exception

嗨在我的应用程序,我有照片video等,在图像的情况下,我做了缩放,但我有时出内存exception,如何有效地处理内存exception。

Solutions Collecting From Web of "android如何处理内存exception"

在尝试加载之前,检查图像大小是否小于可用内存。 因此,处理OutOfMemoryExceptionexception的最有效方法是以这样一种方式构build应用程序,即永远不会尝试将大量数据加载到内存中,以避免出现exception。

OutOfMemory无法处理。 你怎么看?

设备内存已满,你有exception,然后神奇地做了一些事情,删除exception,你现在有更多的堆。 这是不可能的,你知道的。

必须防止OutOfMemory,发生后不处理。

Activity中有一个方法,当设备内存不足时调用,但这只能用于触发caching文件清理。 这并不意味着你的应用程序进程已经出现了。

您也可以添加一个try catch块来捕获Error或OutOfMemoryError,但是这太迟了。

在Android应用程序中处理大量的位图或大的位图非常困难。 你会在这篇文章中find关于这个主题的一些提示,来自Romain Guy。

您还可以通过在您提供给BitmapFactory.decode *()方法的BitmapFactory.options中指定样本大小来直接将位图加载到所需的分辨率。

我已经开始尝试这个例程,它将jpeg加载到ImageView中并检查Out of Memory并重新调整直到适合。

  static public boolean tryJpegRead(ImageView imageView, File fn){ if (!fn.exists()){ Log.d("ANDRO_ASYNC",String.format("missing file %s",fn.getAbsolutePath())); return false; } BitmapFactory.Options o = new BitmapFactory.Options(); for (int i = 1; i<10; i++){ o.inSampleSize = i; o.inJustDecodeBounds = true; BitmapFactory.decodeFile(fn.getAbsolutePath(), o); int h = o.outHeight; int w = o.outWidth; Log.d("ANDRO_ASYNC",String.format("going in h=%dw=%d resample = %d",h,w,o.inSampleSize)); o.inJustDecodeBounds = false; try{ imageView.setImageBitmap( Bitmap.createScaledBitmap( BitmapFactory.decodeFile(fn.getAbsolutePath(), o), w, h, true)); return true; // only happens when there is no error }catch(OutOfMemoryError E){ Log.d("ANDRO_ASYNC",String.format("catch Out Of Memory error")); // E.printStackTrace(); System.gc(); } } return false; } 

在处理与位图操作相关的OutOfMemory错误时,检查解码位图的大小是最好的,而据我所知只有选项。 代码如下:

 public static BitmapFactory.Options getBitmapOptionsWithoutDecoding(String url){ BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(url, opts); return opts; } public static int getBitmapSizeWithoutDecoding(String url){ BitmapFactory.Options opts = getBitmapOptionsWithoutDecoding(url); return opts.outHeight*opts.outWidth*32/(1024*1024*8); } //ref:http://stackoverflow.com/questions/6073744/android-how-to-check-how-much-memory-is-remaining public static double availableMemoryMB(){ double max = Runtime.getRuntime().maxMemory()/1024; Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo(); Debug.getMemoryInfo(memoryInfo); return (max - memoryInfo.getTotalPss())/1024; } public static final long SAFETY_MEMORY_BUFFER = 10;//MB public static boolean canBitmapFitInMemory(String path){ long size = getBitmapSizeWithoutDecoding(path); Log.d(TAG, "image MB:"+size); return size <= availableMemoryMB() - SAFETY_MEMORY_BUFFER; } 

ref: http : //developer.android.com/training/displaying-bitmaps/load-bitmap.html

如果你有像背景或类似的大图像,一个简单的方法来防止内存不足,是将图像从drawable-xhdpi移动到drawable-nodpi,但要小心,这将加载位图没有任何修改。 好的方法应该使用BitmapFactory.options来适应你的需要

 try { // All methods here.... } catch(OutOfMemoryException e){ // Show an AlertDialog with "Memory is full" title // If press ok then starts the process again.. } 

使用android:allowBackup =“true”,android:hardwareAccelerated =“false”和android:largeHeap =“true”来解决这个问题

  <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher" android:hardwareAccelerated="false" android:largeHeap="true" android:theme="@style/AppTheme">