私のカメラアプリでは、メディアレコーダーの停止がメインUIスレッドで呼び出されます。androidサイトの開発者リファレンスとandroidカメラリファレンスコードの両方が同じことをしているようです(メインUIスレッドでstopを呼び出します)。
ただし、特定のシナリオ(SDカードが遅い、並列IOが実行されている、SDカードが非常に断片化されており、ほぼ満杯)では、停止に戻るまでに長い時間がかかるようです(30〜200秒)。メディアレコーダーの停止(録画したビデオファイルを保存するため)の一部として発生するI / O操作が完了するまでに時間がかかるため、これが発生すると思います。
これにより、メインUIスレッドが5秒を超える期間占有されているように見えるため、ANRが発生する可能性があります。
私の最初の本能は、メディアレコーダーの停止を別のスレッドに移動して、UIスレッドが解放されるようにすることでした。ただし、これを行うと、いくつかの危険なシナリオが発生する可能性があります。保存中にユーザーがアプリを終了した場合、このスレッドを強制終了する確実な方法はありません(stop()でスタックしています)。また、メディアレコーダーが停止(および解放)されていない場合、ユーザーはメディアレコーダーインスタンスを必要とする可能性のある他のアプリ(gtalkなど)を使用できません。さらにAndroidは、onPauseでメディアレコーダーをリリースすることを推奨しています。これは、onPauseでこのスレッドに参加する必要があることを意味します。これにより、ユーザーが押し返した場合にANRが発生します。
この状況に対処するための最善の方法について何か提案はありますか?同様のシナリオに遭遇した人が他にいるに違いないと思います。