2016-09-09 7 views
1

私はAsyncTaskビットマップを処理し、それを内部ストレージのファイルに保存するKotlinで書かれています。私の電話には新しいビットマップのための空き領域がないので、書き込み中にIOExceptionがスローされ、アプリケーションがクラッシュするはずです。AsyncTask内のビットマップを圧縮中に例外がスローされません

これは私のdoInBackground()機能である:

override fun doInBackground(vararg params: Int?): Exception? { 
    if(params[0] == null) 
     throw IllegalArgumentException(); 
    Log.d("PhotoEditTask", "start") 
    var bitmap : Bitmap? = null 
     val degrees = if(params.size == 0) 0 else params[0] ?: 0 
     bitmap = BitmapProcessing.getBitmapFromUri(sourceUri, resolver) 
     if (bitmap != null) { 
      bitmap = BitmapProcessing.rotateBitmap(bitmap, degrees) 
      var destFile = File(destPath) 
      destFile.delete() 
      BitmapFile.saveBitmapToFile(bitmap, destFile, 85) 
      Log.d("PhotoEditTask", "save successfull!") 
      return null 
     } 
     bitmap?.recycle() 

    return Exception("Write failed") 

} 

とビットマップへのファイルの書き込み機能は次のとおりです。

fun saveBitmapToFile(source: Bitmap, dest: File, quality: Int) { 
     var fout : FileOutputStream? = null 
     fout = FileOutputStream(dest) 
     source.compress(Bitmap.CompressFormat.PNG, quality, fout) 
     fout.flush() 
     fout.close() 
     Log.d("BitmapProcessing", "fout is closed") 

    } 

これがクラッシュ、または非常に少なくともで例外を返す必要があります"書き込みに失敗しました"というメッセージが表示されますが、電話でファイルを書き込めないため、nullを返すことはありません。しかしログは、そうでない場合を示しています。

09-09 12:16:40.824 26074-26805/com.criptext.uisample D/skia: jpeg_decoder finish successfully, L:1881!!! 
09-09 12:16:40.833 26074-26805/com.criptext.uisample W/System.err: java.io.IOException: write failed: ENOSPC (No space left on device) 
09-09 12:16:40.836 26074-26805/com.criptext.uisample W/System.err:  at libcore.io.IoBridge.write(IoBridge.java:499) 
09-09 12:16:40.836 26074-26805/com.criptext.uisample W/System.err:  at java.io.FileOutputStream.write(FileOutputStream.java:187) 
09-09 12:16:40.837 26074-26805/com.criptext.uisample W/System.err:  at android.graphics.Bitmap.nativeCompress(Native Method) 
09-09 12:16:40.837 26074-26805/com.criptext.uisample W/System.err:  at android.graphics.Bitmap.compress(Bitmap.java:1013) 
09-09 12:16:40.837 26074-26805/com.criptext.uisample W/System.err:  at com.criptext.monkeykitui.util.BitmapFile.saveBitmapToFile(BitmapFile.java:18) 
09-09 12:16:40.837 26074-26805/com.criptext.uisample W/System.err:  at com.criptext.monkeykitui.input.photoEditor.PhotoEditTask.doInBackground(PhotoEditTask.kt:42) 
09-09 12:16:40.838 26074-26805/com.criptext.uisample W/System.err:  at com.criptext.monkeykitui.input.photoEditor.PhotoEditTask.doInBackground(PhotoEditTask.kt:17) 
09-09 12:16:40.838 26074-26805/com.criptext.uisample W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
09-09 12:16:40.838 26074-26805/com.criptext.uisample W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
09-09 12:16:40.839 26074-26805/com.criptext.uisample W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
09-09 12:16:40.840 26074-26805/com.criptext.uisample W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
09-09 12:16:40.840 26074-26805/com.criptext.uisample W/System.err:  at java.lang.Thread.run(Thread.java:848) 
09-09 12:16:40.840 26074-26805/com.criptext.uisample W/System.err: Caused by: libcore.io.ErrnoException: write failed: ENOSPC (No space left on device) 
09-09 12:16:40.842 26074-26805/com.criptext.uisample W/System.err:  at libcore.io.Posix.writeBytes(Native Method) 
09-09 12:16:40.842 26074-26805/com.criptext.uisample W/System.err:  at libcore.io.Posix.write(Posix.java:202) 
09-09 12:16:40.843 26074-26805/com.criptext.uisample W/System.err:  at libcore.io.BlockGuardOs.write(BlockGuardOs.java:197) 
09-09 12:16:40.843 26074-26805/com.criptext.uisample W/System.err:  at libcore.io.IoBridge.write(IoBridge.java:494) 
09-09 12:16:40.843 26074-26805/com.criptext.uisample W/System.err: ... 11 more 
09-09 12:16:40.843 26074-26805/com.criptext.uisample D/skia: ------- write threw an exception 
09-09 12:16:40.844 26074-26805/com.criptext.uisample D/BitmapToFile: fout is closed 
09-09 12:16:40.844 26074-26805/com.criptext.uisample D/PhotoEditTask: save successfull! 
09-09 12:16:40.844 26074-26074/com.criptext.uisample D/PhotoEditTask: result: null 

はログによると、IOExceptionがスローされ、それがどこかに引っ掛かっているが、実行が中断になることはありませんので、それは常にnullを返します。何が起こっている? IOExceptionをどうすれば処理できますか?

+0

:ブール結果を確認しcompress()ニーズを呼び出す

コードの行? –

+0

例外をスローするのではなく、 'Exception'型のコードを返すのも混乱します(AynscTaskの結果を取得するときに' ExecutionException'がスローされます)、 'PhotoEditResult'クラスを返すことができますまたはenumを使用します。 –

+0

いくつかのグーグルを行った後、アンドロイドが画像の復号化に使用するSKIAライブラリの出力ですhttp://stackoverflow.com/questions/5751719/android-skia-image-decoding – gesuwall

答えて

1

Bitmapクラスcompress() methodは、失敗した場合に意図的に例外をスローしません。

戻り値:成功した指定されたストリームに圧縮された場合はブール真を

ドキュメントには、この方法には例外を示していないし、その代わりとして期待戻り値を示しています。例外がスローされないとブール結果のないチェックはありませんので、あなたがのログ出力のあなたのラインを参照している理由

「FOUTが閉じています」。 「書き込みが例外を投げた-------」何の出力

if (!source.compress(Bitmap.CompressFormat.PNG, quality, fout)) { 
    throw IOException("compression failure") 
} 
関連する問題