4

我的应用程序将其当前图像数据保存到文件中,onPause()以便将其从会话保存到会话。但是,我注意到如果我在应用程序处于前台时关闭设备,应用程序会暂停并快速连续重启多次,然后最终在写入文件的过程中被杀死onPause()

在中,我通过调用a然后调用onPause()来请求并等待来自 a 的渲染器线程的图像数据。然后,在我得到数据后,我调用然后将数据写入外部存储上的文件。之后我打电话。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

您是否没有机会将图像保存在 UI 线程中,就在您的 onPause() 调用期间?如果是,您应该将图像保存部分移入AsyncTask并提供某种布尔标志或互斥锁,以防止在前一个图像仍在保存或已保存时启动类似的 AsyncTasks。

小心使用上下文和内部类数据,以防万一你AsyncTask的其他类比你的其他类更长寿,并确保它不会触及任何不属于它的东西。

于 2012-05-17T15:26:44.217 回答