我需要我的Android应用程序将其状态保存到磁盘,当它的活动被放入后台或被杀死时.有人建议我在调用onPause()时启动一个线程,然后在那里执行任何昂贵的I/O程序(请参阅快速,健壮地保存/加载文档状态,以便进行图像编辑).
在什么情况下操作系统会杀死线程以及这些情况发生的频率?
我假设它将像处理操作系统可以任意决定杀死线程的操作一样,但是当资源非常有限时,它们通常只会这样做.尽管如此,找到一些具体的文档会很好.
通过使用一些测试代码,在onPause()中启动的后台线程将在我的设备的后台无限期运行(我尝试加载大量应用程序并且无法将其杀死).
对于我的特定应用程序,我正在编写一个位图编辑器,我正在使用Command模式和Memento模式来允许撤消和重做编辑.我希望用户能够撤消/重做他们的编辑,即使用户接到电话,当活动被放入后台时活动也会被杀死.我能想到的最佳解决方案是使用后台线程在应用程序使用期间不断将我的命令和memento对象保存到磁盘,并在调用onPause时完成保存后台线程中剩余的任何对象.在更糟糕的情况下,如果线程被杀死,我只会丢失一些编辑.
我正在尝试为移动设备编写位图编辑器(即Photoshop的有限版本).用户的文档由大约1000x500大小的~4位图组成.
我想要一个尽可能简单的强大而高效的撤销/重做系统.我的目标是大约0.2秒来撤消或重做编辑.我正在寻找关于我目前的预期方法或我可以使用的一些新想法的一些反馈.我认为我所拥有的东西太复杂了,所以我对继续进行谨慎,所以只要知道我能做的最好就会很好.
我已经尝试了使用Command模式和Memento模式的组合来实现我的撤销/重做系统.到目前为止我得出的一些结论是:
我没有足够的内存,我不能足够快地将内存写入磁盘,以便在许多情况下使用纪念品支持上一个命令的"未执行"操作,例如,如果用户很快就进行了几次单独的绘画操作,我就不会能够存储表示用户绘制内容的位图,而不会让用户等待保存它们.
如果我将文档恢复到其初始状态并重放除最后一个命令之外的所有命令以实现撤销,即使是适量的命令,例如重放10个绘画笔划或5个涂抹笔划需要~1秒,这也太慢了呆滞.
我可以通过将整个文档定期保存到磁盘并在播放命令之前恢复到此检查点来解决前一点.为了比上一个检查点更进一步撤消,我们在此之前重新加载检查点并重放命令.
方法2有3个工作正常,除了保存整个文档变得越来越慢,因为添加了更多的图层,并且它已经慢了4位图(等待5到10秒).因此,我需要修改3,以便我只保存自上次以来发生的变化.
由于许多命令仅在一个层上运行,因此仅保存自上一个检查点以来已修改的层是有意义的.例如,如果我有3个初始层,我已经指出可以保存检查点的位置,那么我的命令堆可能看起来像这样.
(Checkpoint1: Save layer 1, 2 and 3.)
Paint on layer 1
Paint on layer 1
(Checkpoint2: Save layer 1. Reuse saved layers 2 and 3 from Checkpoint1.)
Paint on layer 2
Paint on layer 2
(Checkpoint3: Save layer 2. Reuse saved layers 1 and 3 from Checkpoint2.)
Paint on layer 3
Paint on layer 3
Flip layer 3 horizontally.
(Checkpoint4: Save layer 3. Reuse saved layers 1 and 2 from Checkpoint3.)
Resize …Run Code Online (Sandbox Code Playgroud) 我有一个包含大约200,000个长值的文件,我希望尽快将其读入long [].它适用于Android应用; 函数调用很慢(所以任何涉及用"for"循环一次读取很长时间的东西都会超级慢)我需要加载才能快速.我可以用什么?我看到的一切似乎只能快速读取字节.
我已经使用ByteBuffer并FileChannel从NIO包之前,这似乎是一个非常快的方式从文件加载值数组.但是,我无法弄清楚如何使用它来将数据读入long [].我已经尝试将long []包装为LongBuffer,但我无法看到任何可以将文件中的数据提供给LongBuffer的方法.
编辑:我使用哪种方法,我需要能够使用Arrays.binarySearch上long[]的高端磁盘阵列.
我正在寻找一些批评我的方法来存储Android和iPhone手机的位图编辑器的状态.即使是"看起来很好!" 回复会很棒!
在应用程序中,当前用户文档包含几个可以绘制的位图图层(每个可能是1024 x 768像素).该应用程序的基本要求是:
我需要能够保存和恢复文档状态.
当用户退出应用程序或接到电话时,我需要能够快速保存文档状态(大约2秒钟内).
如果应用程序崩溃,我需要能够恢复文档状态(如果用户失去可能30秒的工作,则可以).
对于1,我找不到任何支持图层的打开文件格式.我将使用以下文件结构来存储我的文档:
document_folder/
layer1.png
layer2.png
...
metadata.xml
Run Code Online (Sandbox Code Playgroud)
图层只存储为.png文件,.xml文件包含数据,例如当前可见的图层.文档文件夹可以由应用程序按原样打开,也可以将文件夹存储在.zip文件中.对于其他应用程序来说,这似乎是一个很好的简单格式.
除了.png文件,我还允许以自定义.raw文件格式保存图层,其中包含来自位图的未处理原始像素数据.我可以在手机上快速保存这些(<0.5s),而.png文件需要一两秒钟.
我在启动时快速保存文档的计划是创建一个名为/ autosave的文件夹,并在那里保存所有图层的.raw版本.在一个图层上编辑几个命令之后,我会在后台线程中更新该图层的.raw文件.为了保存时的稳健性,我会将图层保存为例如layer1_tmp.raw,当我确认文件已完全写入时,将layer1.raw替换为此文件.
如果应用程序在使用过程中崩溃,我只需重新打开/ autosave文件夹.当应用程序关闭或用户接到电话时,我只需要将最后修改的层更新为自动保存.当用户想要保存时,我只是将所有.raw文件转换为.png文件,然后压缩文件夹.
你怎么看?有明显的缺陷吗?有更简单的方法吗?我不知怎的重新发明轮子?谢谢.