1

BitmapアプリでSDカードに保存するオプションがあります。メソッド
で保存を行っています。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;
 }

このメソッドから null を取得した場合、保存の失敗などに関する情報をユーザーに表示しています。これで十分だと思いOutOfMemoryますが、この方法で 1 人のユーザーからクラッシュが報告されました。スタックトレース:

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のですが、サイズが大きく、解像度の高い画像であるため、品質を下げたくありません。さらに重要なことに、 try catch にあったにもかかわらず、アプリがクラッシュした理由を知りたいですか?

4

3 に答える 3

1

例外ではなく、キャッチ OutOfMemoryError を使用してください。

try {
    // your code
} catch (OutOfMemoryError e) {
}
于 2013-04-24T06:30:43.663 に答える
0

プログラムがメモリ不足になると、回復が困難になる場合があります。そうなったときの片付け方をよく考える必要があります。たとえば、saveImageToExternalStorage では、try/catch 内で例外が発生した場合、fOut はクリーンアップされません。したがって、次のようなことを行う必要があります

OutputStream fOut = null;

try/catch の外で、try/catch の finally ブロックで閉じます。そして、finally ブロックのキャッチでさらに例外が発生する可能性に注意してください。

于 2013-04-24T06:30:29.210 に答える