2013-04-24 77 views
0

我可以選擇將Bitmap保存到我的應用程序中的sdcard。
我在做保存AsyncTask方法。這裏是我做的背景內存不足異常未捕獲

public File saveImageToExternalStorage(Bitmap image, String name) { 
String fullPath = Environment.getExternalStorageDirectory().getAbsolutePath() + APP_PATH_SD_CARD + APP_THUMBNAIL_PATH_SD_CARD; 

try { 
File dir = new File(fullPath); 
if (!dir.exists()) { 
dir.mkdirs(); 
} 
OutputStream fOut = null; 
File file = new File(fullPath, name.replaceAll("/", "").trim()); 
file.createNewFile(); 
fOut = new FileOutputStream(file); 
image.compress(Bitmap.CompressFormat.JPEG, 50, fOut); 
fOut.flush(); 
fOut.close(); 
MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName()); 

return file; 

} catch (Exception e) { 
return null; 
} 

我顯示有關未能保存和等用戶,如果我得到空從這個方法的一些信息。我雖然這應該是足夠的,但我從這個方法報告了一個用戶崩潰OutOfMemory。堆棧跟蹤:

java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:299) 
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.OutOfMemoryError 
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527) 
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:301) 
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:326) 
at android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:796) 
at com.stancedcars.wallpapers.FullSelected.saveImageToExternalStorage(FullSelected.java:223) 

我很想解決OutOfMemory問題,但Bitmap s爲大小重,高分辨率的圖像,我不想降低質量。更重要的是,我想知道爲什麼應用程序崩潰,即使它在嘗試捕獲?

+0

你想減少分辨率的圖像嗎?如果是這樣,我可以幫你。 – 2013-04-24 06:32:56

回答

5

您捕獲通用異常,而OutOfMemoryError是一個錯誤,也是Throwable。

你有什麼

java.lang.Object 
    ↳ java.lang.Throwable 
     ↳ java.lang.Error 
      ↳ java.lang.VirtualMachineError 
       ↳ java.lang.OutOfMemoryError 

你可以捕捉什麼

java.lang.Object 
    ↳ java.lang.Throwable 
     ↳ java.lang.Exception 

以抓住一切可能將Throwable,你需要捕捉

try { 
    //... 
} catch (Throwable e) { 
    e.printStackTrace(); 
} 
+0

謝謝,那正是我所需要的。出於某種原因,我雖然異常是最低級別,你可以抓:) – Datenshi 2013-04-24 06:44:16

0

一旦程序超出內存它可能很難恢復。當發生這種情況時,您需要仔細思考如何嘗試清理。例如,在saveImageToExternalStorage中,如果try/catch內發生異常,它不會清除fOut。所以你應該做一些像put

OutputStream fOut = null; 

try/catch之外,然後關閉try/catch的finally塊。並且要注意在finally塊的捕獲中進一步例外的可能性。

1

使用catch OutOfMemoryError不是例外!

try { 
    // your code 
} catch (OutOfMemoryError e) { 
}