我的应用程序将其当前图像数据保存到文件中,onPause()
以便将其从会话保存到会话。但是,我注意到如果我在应用程序处于前台时关闭设备,应用程序会暂停并快速连续重启多次,然后最终在写入文件的过程中被杀死onPause()
。
在中,我通过调用a然后调用onPause()
来请求并等待来自 a 的渲染器线程的图像数据。然后,在我得到数据后,我调用然后将数据写入外部存储上的文件。之后我打电话。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() 尝试在后台线程仍在写入的同时读取图像数据,这显然也会导致错误。