私のアプリケーションは、現在の画像データをファイルに保存しonPause()
て、セッション間で保持します。ただし、アプリがフォアグラウンドにあるときにデバイスの電源を切ると、アプリが一時停止して何度も再起動され、ファイルへの書き込み中に最後に強制終了されることに気付きましたonPause()
。
では、 を呼び出してから を呼び出すことでonPause()
、 のレンダラー スレッドに画像データを要求して待機します。次に、データを取得したら、呼び出して、データを外部ストレージのファイルに書き込みます。その後、私は電話します。GLSurfaceView
gLSurfaceView.queueEvent()
FutureTask
futureTask.get()
gLSurfaceView.onPause()
super.onPause()
ただし、onPause()
外部ストレージへの書き込み中に中断されたようで、次にアプリを再起動したjava.io.EOFException
ときに、保存されたデータを読み込もうとすると報告されます。
デバイスの電源を切るとどうなるかを記録しました。トレースは次のとおりです。
05-17 16:03:47.405: V/App(4633): onPause called
05-17 16:03:47.405: V/App(4633): Get data from render thread.
05-17 16:03:47.670: V/App(4633): Got data from render thread.
05-17 16:03:47.855: V/App(4633): Save image start
05-17 16:03:48.265: V/App(4633): Image saved!
05-17 16:03:48.265: V/App(4633): super.onPause()
05-17 16:03:48.270: V/App(4633): onPause finished
05-17 16:03:48.270: V/App(4633): onSaveInstanceState()
05-17 16:03:48.315: V/App(4633): onCreate()
05-17 16:03:48.345: V/App(4633): restoreState() with bundle
05-17 16:03:48.345: V/App(4633): Start read image.
05-17 16:03:49.055: V/App(4633): Image read
05-17 16:03:49.715: V/App(4633): onResume()
05-17 16:03:51.595: V/App(4633): onPause called
05-17 16:03:51.595: V/App(4633): Get data from render thread.
05-17 16:03:51.770: V/App(4633): Got data from render thread.
05-17 16:03:51.910: V/App(4633): Save image start
05-17 16:03:52.580: V/App(4633): Image saved!
05-17 16:03:52.580: V/App(4633): super.onPause()
05-17 16:03:52.580: V/App(4633): onPause finished
05-17 16:03:52.585: V/App(4633): onSaveInstanceState()
05-17 16:03:53.795: V/App(4633): onResume()
05-17 16:03:53.805: V/App(4633): onPause called
05-17 16:03:53.805: V/App(4633): Get data from render thread.
05-17 16:03:54.205: V/App(4633): Got data from render thread.
05-17 16:03:54.520: V/App(4633): Save image start
その後、デバイスがシャットダウンするか、少なくともロギングが停止します。
おそらく、データは最初の 2 回は正しく保存されますが、アプリがファイルへの書き込みを完了していないため、3 回目にはスラッシングされます。
データを書き込むバッファを交互に使用し、正常に書き込んだ後に最新のデータを含むバッファへの参照を保存するダブルバッファソリューションを実装することを考えています。しかし、もっと簡単な方法があるに違いないと思います。
この問題を回避/回避する方法について何かアドバイスはありますか?
注: onPause() 全体で 1 秒近くかかるため、バックグラウンド スレッドで [GLSurfaceView から読み取り、GLSurfaceView を一時停止してファイルに保存] というシーケンスも試してみましたが、onCreate() がバックグラウンドスレッドがまだ画像データを書き込んでいる間に画像データを読み取ると、明らかにエラーが発生します。