【发布时间】:2011-10-17 04:00:58
【问题描述】:
(请注意,我已经在网上搜索了我在下面描述的警告,但几乎没有找到任何关于它们的信息。)
我正在使用 API 级别 10。我有一个首选项屏幕(基于 XML),其中的一个选项创建了一个自定义 ListActivity,如下所示:
-
PreferenceActivity 包含一个选项,用于创建...
-
ListActivity 这是一个对话框,它使用...
-
setOnClickListener() 包含一个 onClick() 方法(在调用 finish() 之前)将 startActivity() 一个新的 Intent...
-
sub-Activity 启动一个...
- AsyncTask 执行可变时间工作,完成后调用...
- onPostExecute() 调用了finish()
-
sub-Activity 启动一个...
-
setOnClickListener() 包含一个 onClick() 方法(在调用 finish() 之前)将 startActivity() 一个新的 Intent...
-
ListActivity 这是一个对话框,它使用...
问题是,它有效......但我收到了大量警告:
10-16 21:59:25.010: WARN/WindowManager(170): Rebuild removed 4 windows but added 3
10-16 21:59:25.010: WARN/WindowManager(170): This window was lost:.....
奇怪的是,这些警告只有在任务快速执行时才会出现!当我向我的 AsyncTask 添加 Thread.sleep() 调用以人为地膨胀其运行时时,它起作用并且没有发出任何警告。事实上,只要运行时间超过(大约)500 毫秒,它就可以正常工作。 (请注意,我尝试使用 startActivityForResult() 没有更大的效果 - 出现同样的问题。)
目标是用户选择一个首选项,他们更改其设置,进行一些处理,然后用户回到他们开始的首选项菜单。
我打赌这是一个竞争条件...销毁窗口的顺序因运行时间而异...我的印象是,当子活动在其父 ListActivity 之前关闭时,警告被抛出。但是在其中添加 1s sleep() 并不是一个合理的解决方案,除非这是某种 Android 错误(不太可能,但我今天已经重现了其中的几个)。
那么,导致这种警告流的这个我的缺陷是什么?最好说“根据喜好,做这个,然后做那个,然后完成”,但我认为我正在做的是等价的。也许不是……想法?
编辑:我决定尝试将此 ListActivity 作为自定义 Dialog... 这是我最近尝试做的最痛苦的事情之一(getApplication() 不起作用,而且许多其他事情似乎都发生了错了……在某种程度上可能是缺乏经验,但对话也不是为此而生的……
【问题讨论】:
-
您在子活动中的哪个位置开始您的 AsyncTask?也许它与 finish() 调用的时间有关。如果将finish() 放在当前启动AsyncTask 的位置会发生什么?同样的警告?
-
我已经尝试了几种方法,最明显的是使用“forResult”版本等待它完成,以及移动finish()。没有帮助。让子活动成为一个对话框可能会更好,但这仍然需要更多的工作(可能有必要,因为现在在此活动期间启用了后退按钮,它真的不应该避免更大的竞争条件问题) .我想知道问题是否出在父窗口...现在它是一个如图所示的长链...也许我的新 Activity/Dialog 应该具有 Preferences 的上下文而不是 ListActivity。
标签: android android-activity android-intent warnings android-asynctask