对于我的应用程序,我有大约15Mb(可以压缩一些处理能力到大约5Mb)的音频+视频+图像数据,我需要保存到磁盘。例如,当用户被电话打断(因为活动可能会在此之后被杀)以及用户离开应用程序时,我需要保存此信息。
如果我不压缩它,我可以在大约10秒钟内将数据保存到SD卡,如果我压缩它,我可以将数据保存到SD卡,我希望它压缩。 调用onPause时我有哪些保存数据的选项,以确保数据已保存?
从一些基本实验中,如果onPause在5秒后没有完成,我的活动就会被杀死。我有过一些想法:
在onPause中启动新线程并将数据保存在那里。这似乎工作正常,但似乎是我不应该做的事情。
启动服务,以某种方式将数据复制到服务(这会很慢吗?)然后获取服务以保存数据。我认为这会在手机顶部放置一个通知图标,但我不认为用户在此处看到“保存数据...”任务很糟糕。
我可以快速将数据放入SQL数据库,然后在用户返回应用程序后保存吗?
(由于应用程序的性质,我实际上没有任何实际的方法可以保存数据,因为用户可以通过耗时的操作以破坏性方式转换数据(例如,某些操作需要10秒)即使我存储了原始数据和为重新创建数据而执行的操作列表,用户在下次启动应用程序时也必须等待一两分钟。)
答案 0 :(得分:5)
调用onPause时,我有什么选项可以保存我的数据,以确保数据已保存?
从技术上讲,你想要的是不可能的。 onPause()
之后无法保证。
最好的答案是@ViktorLannér所建议的。换句话说,不要等到onPause()
需要做10-20秒的I / O.设计一些机制,允许您在用户执行操作时以增量方式保存,如果没有别的话,则作为回退机制。这类似于数据库维护事务日志的方式。
在onPause中启动一个新线程并在那里保存数据。这似乎工作正常,但似乎是我不应该做的事情。
这很危险,因为如果活动正在结束(例如,onDestroy()
将暂时调用),Android可能会在您的主题完成之前终止您的流程。
启动服务,以某种方式将数据复制到服务(这会很慢吗?)然后获取服务以保存数据。我认为这会在手机的顶部放置一个通知图标,但我不认为用户在这里看到“保存数据...”任务很糟糕。
将其设为IntentService
,以便在工作完成后自动关闭。我不会“将数据复制到服务”,而是在需要时由静态数据成员集中提供数据。这不会自动将“通知图标放在手机顶部”,对于这段时间内的某些内容,可能不需要这样做。
我可以快速将数据放入SQL数据库,然后在用户返回应用程序后保存吗?
对于SQL数据库而言,Flash I / O并不比其他任何东西快。
由于应用程序的性质,我实际上没有任何实际的方法可以保存数据,因为用户可以通过耗时的操作以破坏性的方式转换数据(例如,某些操作需要10秒) p>
然后这可能不适用于移动平台。考虑这个应用程序是否适合使用该技术。