Android 是否从不同的活动方法更新活动UI?

Android 是否从不同的活动方法更新活动UI?,android,tabs,android-activity,android-asynctask,Android,Tabs,Android Activity,Android Asynctask,我有一个选项卡小部件,其中一个选项卡是聊天类型的功能。我想每隔一段时间更新聊天数据(根据聊天选项卡是否处于活动状态而定) 最好的方法似乎是在我的主TabActivity类中使用AsyncTask,因为这样可以避免在后台运行AsyncTask时破坏聊天活动的任何问题。我希望确保活动不会被销毁和重新创建,从而导致AsyncTask无法修改实际活动的数据 但是,现在我的AsyncTask位于TabActivity活动中,我再也没有直接的方法从我的onPostExecute()方法调用聊天室的ListA

我有一个选项卡小部件,其中一个选项卡是聊天类型的功能。我想每隔一段时间更新聊天数据(根据聊天选项卡是否处于活动状态而定)

最好的方法似乎是在我的主TabActivity类中使用AsyncTask,因为这样可以避免在后台运行AsyncTask时破坏聊天活动的任何问题。我希望确保活动不会被销毁和重新创建,从而导致AsyncTask无法修改实际活动的数据

但是,现在我的AsyncTask位于TabActivity活动中,我再也没有直接的方法从我的
onPostExecute()
方法调用聊天室的ListAdapter
notifyDataSetChanged()
。有没有办法从TabHost/TabActivity获取对给定选项卡当前活动的引用


或者,我可以假设我的聊天活动永远不会作为TabActivity活动的子活动销毁(至少在TabActivity处于活动状态时不会销毁),然后将AsyncTask放入聊天活动中吗?

实际上,最好的方法是让线程运行并定期获取聊天数据。然后,您可以从UI轮询线程以获取新消息。通过这种方式,无论
活动发生什么情况,您都可以让线程运行。如果您正在为tabhost使用意图加载机制,那么您应该可以安全地假设任务不会像tabhost本身那样被随机终止(仅暂停),并且您可以安全地修改其中的视图(至少在TabHost上尽可能安全)

但要注意:任何活动都可能随时被终止(例如:如果用户在任务仍在运行时单击选项卡中打开新活动的链接),包括tabhost本身,当任务返回并尝试更新现已停止的活动的UI时,可能会导致严重崩溃。因此,请确保在销毁时取消异步任务,让异步任务在返回结果之前检查您的活动是否仍处于活动状态(请参阅Android源代码树中的WeakAsyncTask),或者使用活动无关(半)持久性可轮询背景线程解决方案,如CaseyB所建议的(这是一个很好的预处理解决方案)

或者,您可以让AsyncTask的UI更新代码捕获所有异常(我见过一些这样做的应用程序),然后以静默方式失败,但我觉得这很有趣


最近,我在大多数地方使用了WeakAsyncTask的一个修改版本来检查活动是否在返回时未完成。

这个修改版本工作得很好:在我的聊天活动中,我生成一个线程,并在该线程中创建一个处理程序来启动定期下载。下载成功后,我更新
runOnUIThread()
中的适配器数据集。然后,我使用我的处理程序的
postDelayed()
方法安排下一个更新周期。当我的活动被销毁时,我在更新Runnable上使用
handler.removeCallback()
。谢谢!