从不同的活动方法更新活动用户界面?

问题描述:

我有一个选项卡小部件,其中一个选项卡是聊天类型的功能。我想以一个时间间隔更新聊天数据(根据聊天标签是否有效而变化)。从不同的活动方法更新活动用户界面?

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

但是,既然我的AsyncTask在TabActivity活动中,我没有直接的方法可以从我的onPostExecute()方法中调用我的Chat的ListAdapter notifyDataSetChanged()了。有没有一种方法从TabHost/TabActivity获取给定Tab的当前Activity的引用?

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

真的最好的方法是让一个线程运行并定期获取聊天数据。然后从你的用户界面你可以轮询线程获得新的消息。这样,无论Activity发生什么情况,都可以让线程运行。

+0

这个修改后的版本效果很好:在我的聊天活动中,我产生了一个线程,并在该线程中创建一个处理程序来启动我的定期下载。成功下载后,我会在'runOnUIThread()'内更新Adapter数据集。然后使用我的处理程序的'postDelayed()'方法安排下一个更新周期。当我的活动被破坏时,我在我的更新Runnable上使用'handler.removeCallback()'。谢谢! – stormin986 2010-05-05 00:15:57

如果您为您的tabhost使用Intent加载机制,那么您应该安全地承担任务不会随机死于TabHost本身(仅暂停),并且您可以安全地修改视图它(尽可能安全地至少从TabHost开始)。

但要小心:任何活动都可以在任何时候被杀死(例如:如果用户在任务仍在运行时打开新活动的选项卡中单击链接),包括tabhost本身,这可能会导致当任务返回并尝试更新现在已死的Activity的UI时,丑陋的崩溃。所以请确保在销毁时取消AsyncTasks,让asynctasks在返回结果之前检查您的活动是否仍然活动(请参阅Android源代码树中的WeakAsyncTask),或者使用与Activity无关的(半)持久性可调节后台线程解决方案CaseyB建议(cwac-bus是一个很好的预制解决方案)。

或者,您可以只是让AsyncTask的UI更新代码捕获所有异常(我已经看到一些应用程序可以做到这一点)并且默默失败,但是这对我来说很有趣。

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