在Android应用程序中,我在一个单独的线程中运行任务。在线程运行时,它会更新主窗口中的进度条,让用户知道发生了什么。问题是,如果用户第二次启动线程,则不会重置进度条。它只会100%没有做任何事情。
整个来源是available on github。以BackupThread为例 和JsonBackup(主要班级)。请注意,“RestoreThread”显示相同的行为,但我认为在这两种情况下问题都是相同的。
快速浏览:
在line 300 in JsonBackup.java左右,我打开一个新的ProgressDialog。因为它是一个新实例,我假设所有都已正确初始化。在我当前的工作副本中,我添加了一行将进度设置为“0”,但这并未改变任何内容。在同一个块中,我创建备份线程并运行它。
下一段感兴趣的代码是线程将其进度传回主应用程序的时刻。这发生在line 185 of BackupThread.java附近。
该消息在line 80 of JsonBackup.java中处理,它将更新进度条。
到目前为止代码演练。写这篇文章时让我感到震惊的是line 87 of JsonBackup.java。我认为最好是线程发送不同的消息,明确说明它已经完成。但我认为这不是真正的问题。我这样说是因为进度对话框一旦达到100%就会正确地解散。
所以,如果整个事情运行一次,一切都按预期工作。现在假设用户离开了应用程序,但操作系统决定将其加载到内存中。稍后用户回来并想要创建新备份。然后应用程序将无法正常工作,因为进度挂起100%。如果你杀了应用程序,所以它完全卸载它将再次工作。所以我假设一些对象实例仍在内存中并且在重新运行时具有不洁状态。但对于我的生活,我无法找到正在发生的事情。作为一个切线我可能会补充:除了记事本教程,这是我的第一个Android应用程序,而且bla di blah blah ...
我在这里想念的是什么......?
答案 0 :(得分:4)
Dialog
缓存Activity
,这是预期的行为
选项包括:
onPrepareDialog(..)
以重置其状态removeDialog(..)
show()
,dismiss()
对于常用的Dialog
和#3,我通常会排在第一位。
答案 1 :(得分:1)
我通常使用onCreateDialog()和onPrepareDialog()来管理对话框。
From dev guide on android developers:
第一次创建对话框时,会调用定义onCreateDialog(int)和onPrepareDialog(int,Dialog)回调方法的最佳方法是使用switch语句检查传入方法的id参数。每个案例都应检查唯一的对话框ID,然后创建并定义相应的对话框。
onCreateDialog()方法一次;在这里放置初始化对话框的代码。
每次显示对话框时都会调用onPrepareDialog()方法。
它提供了准备的机会 它之前的托管对话框 所示。如果需要,请覆盖此项 根据更新托管对话框 申请状态
当必须关闭对话框时,您可以:
如果您正在使用onCreateDialog(int) 管理对话框的状态 (如前所述 部分),然后每次你的对话 被解雇,对话的状态 对象由Activity保留。如果 你决定不再了 需要这个对象或者它很重要 国家被清除,那么你 应该调用removeDialog(int)。这个 将删除任何内部引用 对象,如果对话框是 显示,它会解雇它。