2

我有一个标签小部件,其中一个标签是聊天类型的功能。我想定期更新聊天数据(取决于聊天选项卡是否处于活动状态)。

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

但是,既然我的 AsyncTask 位于 TabActivity 活动中,我就没有直接的方法来notifyDataSetChanged()从我的onPostExecute()方法中调用我的 Chat 的 ListAdapter。有没有办法从 TabHost/TabActivity 中获取对给定 Tab 的当前 Activity 的引用?

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

4

2 回答 2

2

真正做到这一点的最好方法是让一个线程运行并定期获取聊天数据。然后从您的 UI 中,您可以轮询线程以获取新消息。这样,无论Activity.

于 2010-05-04T22:01:51.707 回答
2

如果您正在为您的 tabhost 使用 Intent 加载机制,那么您应该安全地假设该任务不会比 TabHost 本身被随机杀死(仅暂停),并且您可以安全地修改其中的视图(安全地至少可以从 TabHost 中获得)。

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

或者,您可以让 AsyncTask 的 UI 更新代码捕获所有异常(我见过一些这样做的应用程序)并静默失败,但这对我来说很有趣。

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

于 2010-05-04T22:09:02.387 回答