0

我有一个使用 PagerAdapter 的活动应用程序。在 OnCreate 事件中,我触发了 PagerAdapter 中所有 7 个页面的膨胀。各个页面都有标准小部件,一个页面有谷歌地图。在 AVD 中进行测试时一切正常。

但是,如果我的应用程序被暂停或停止,然后重新启动或恢复怎么办?我在 pageradapter 中的所有页面的膨胀是否都会被删除?我必须重新充气所有页面吗?

更普遍...

我已经阅读了很多关于我的应用程序停止或暂停发生的情况以及在重新启动或恢复时我应该做什么的文章,但我还没有看到需要重建和不需要重建的精确说明. 我读到“这是刷新 UI 的好地方”,但我不确定这到底是什么意思。

乞讨的问题可能是...

我的内部状态是否已恢复,即我的变量、sqlLite db、文件内容的值。

我的小部件中的值是否已恢复,即文本框中的字符。

如果暂停或停止可能发生在 for 循环或代码块的中间,我如何防止损坏?

谢谢,加里

4

2 回答 2

2

但是,如果我的应用程序被暂停或停止,然后重新启动或恢复怎么办?我在 pageradapter 中的所有页面的膨胀是否都会被删除?我必须重新充气所有页面吗?

如果你的意思是应用程序Activity,当它暂停时,这意味着它现在不是焦点Activity。所有的状态都还在。这基本上意味着您不能接受任何前台事件,直到onResume(). 如果操作系统决定调用 ,onSaveInstanceState()您实际上可以存储诸如实例变量的值之类的东西,或者只是为新实例读取的标志。你不能在这里存储复杂的东西。所以像ThreadorCursor实例这样的东西是不合适的。基本上任何不是“数据”的东西。

如果活动被破坏甚至进程被杀死,那么是的,您将需要重新绑定并重新充气所有内容。然而,它的美妙之处在于,在大多数情况下,您不必做任何特别的事情。只有在您可能已经写入捆绑包的情况下,您onSaveInstanceState()才需要做一些额外的工作。

我的内部状态是否已恢复,即我的变量、sqlLite db、文件内容的值。

如果转换仅在 onPause 和 onResume 之间进行,则可以。一切都应该没问题。如果有销毁或进程终止,活动将重新启动,onCreate()并且必须根据Bundle savedInstanceState. 稍后我将介绍 sqlite 和文件。

我的小部件中的值是否已恢复,即文本框中的字符。

通常如果他们有saveEnabled(true)(大多数人有)并且TextView有一个 freezesText 属性,可以让他们记住最后设置的文本。但是,大多数情况下,如果您在onSaveInstanceState()调用期间正确保存了状态,则很可能您不仅存储了 UI 状态,还存储了其他方式。在这种情况下,您最好在进行下一个时同步它们onCreate()

如果暂停或停止可能发生在 for 循环或代码块的中间,我如何防止损坏?

所以onPause()onStop()发生在主 UI 线程上。如果您当前正在 UI 线程上运行代码,则它必须在这些其他回调发生之前完成。如果您在其他线程上运行,那么是的,您必须尝试在 UI 线程上完成任务的输出。它简化了很多。

另一方面,杀戮可能会发生。当我们谈论腐败时,这通常会影响程序内存之外的东西。就像您打开了文件句柄或打开了 sqlite 光标或打开了网络套接字一样。有了这个,你必须在使用它之前检查状态。

IE

  • 在读取或写入目录之前确保目录确实存在
  • 确保文件的内容以前被正确写入(简单的预期校验和通常在这里工作或版本元数据)。
  • 在使用 sqlite 时使用事务,以确保您只将数据以完整的原子块写入表,这样您就没有表的行引用其他表中不存在的状态。
  • 网络连接将被重置,并且您选择的网络协议之类的东西应该与您连接的应用程序一起为您进行完整性检查。

希望这会有所帮助,虽然它还没有完全完成,但它是一个很好的开始方法。

于 2012-10-09T00:17:14.397 回答
0

在暂停和停止状态下,您的所有对象都将被保留,您无需担心循环中断,除非完成可能会产生 ANR 需要超过 5 秒。

但是,当进入这些状态以释放不需要或可以轻松重新创建的对象时,特别是当它们使用大量内存时,并在重新进入状态恢复或重新启动时重新创建它们,这是一种很好的做法。

当您的应用程序进入 Destroy 状态时,您的所有对象都将丢失。

于 2012-10-09T00:06:24.733 回答