4

私のアプリケーションは、現在の画像データをファイルに保存しonPause()て、セッション間で保持します。ただし、アプリがフォアグラウンドにあるときにデバイスの電源を切ると、アプリが一時停止して何度も再起動され、ファイルへの書き込み中に最後に強制終了されることに気付きましたonPause()

では、 を呼び出してから を呼び出すことでonPause()、 のレンダラー スレッドに画像データを要求して待機します。次に、データを取得したら、呼び出して、データを外部ストレージのファイルに書き込みます。その後、私は電話します。GLSurfaceViewgLSurfaceView.queueEvent()FutureTaskfutureTask.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() がバックグラウンドスレッドがまだ画像データを書き込んでいる間に画像データを読み取ると、明らかにエラーが発生します。

4

1 に答える 1

0

onPause() 呼び出し中にちょうどいいタイミングで、UI スレッドに画像を保存していませんか? はいの場合は、画像保存部分を に移動し、AsyncTaskある種のブール値フラグまたはミューテックスを提供して、前の画像がまだ保存されている間、または既に保存されているときに同様の AsyncTasks が開始されないようにする必要があります。

他のクラスよりも長生きする場合に備えて、コンテキストと内部クラス データの使用に注意し、AsyncTaskそれに属さないものに触れないようにしてください。

于 2012-05-17T15:26:44.217 に答える