我有一个标签小部件,其中一个标签是聊天类型的功能。我想以一定间隔更新聊天数据(根据聊天选项卡是否处于活动状态而变化)。
最好的方法似乎是在我的主TabActivity类中使用AsyncTask,因为这样可以避免在后台运行AsyncTask时导致聊天活动被破坏的任何问题。我想确保不会销毁和重新创建Activity,从而导致我的AsyncTask无法修改实际活动的Activity数据。
但是,现在我的AsyncTask在TabActivity活动中,我没有直接从我的notifyDataSetChanged()
方法调用我的Chat的ListAdapter onPostExecute()
。有没有办法从TabHost / TabActivity获取对给定Tab的当前活动的引用?
或者,或者,我可以假设我的聊天活动永远不会被销毁为TabActivity活动的子活动(好吧,至少在TabActivity活动时从未销毁),然后只是将AsyncTask放入聊天活动中?
答案 0 :(得分:2)
实际上,最好的办法是让一个运行并定期获取聊天数据的线程。然后,从您的UI中,您可以轮询线程以获取新消息。这样,无论Activity
发生了什么,都可以让线程运行。
答案 1 :(得分:2)
如果您正在使用Tabhost的Intent加载机制,那么您应该可以安全地假设任务不会被TabHost本身随机杀死(仅暂停),并且您可以安全地修改其中的视图(至少可以从TabHost中安全地进行)。
但要注意:任何活动都可以随时被杀死(例如:如果用户点击选项卡中的链接,在您的任务仍在运行时打开新活动),包括tabhost本身,这可能导致丑陋任务返回时崩溃并尝试更新现已停止的活动的UI。因此,请确保在销毁时取消AsyncTasks,让asynctasks在返回结果之前检查您的活动是否仍处于活动状态(请参阅Android源代码树中的WeakAsyncTask),或使用与活动无关(半)持久可轮询后台线程解决方案CaseyB建议(cwac-bus是一个很好的预制解决方案)。
或者你可以让AsyncTask的UI更新代码捕获所有异常(我已经看到一些应用程序执行此操作)并且无声地失败,但这对我来说很有趣。
最近我在大多数地方都使用了WeakAsyncTask的修改版本,在个人返回时检查活动是否未完成。