2

タブの1つがチャットタイプの機能であるタブウィジェットがあります。チャットデータを一定間隔で更新したい(チャットタブがアクティブかどうかによって異なります)。

最善のアプローチは、メインのTabActivityクラスでAsyncTaskを使用することであるように思われました。これにより、AsyncTaskの実行中にバックグラウンドでチャットアクティビティが破棄される問題を回避できます。アクティビティが破棄および再作成されないようにしたかったので、AsyncTaskが実際のアクティブなアクティビティのデータを変更できなくなりました。

ただし、AsyncTaskがTabActivityアクティビティに含まnotifyDataSetChanged()れているため、メソッドからチャットのListAdapterを直接呼び出す方法はありonPostExecute()ません。TabHost / TabActivityから特定のタブの現在のアクティビティへの参照を取得する方法はありますか?

または、代わりに、チャットアクティビティがTabActivityアクティビティの子アクティビティとして破棄されることはなく(少なくともTabActivityがアクティブな間は破棄されない)、AsyncTaskをチャットアクティビティに配置するだけでよいと想定できますか?

4

2 に答える 2

2

これを行うための本当に最良の方法は、チャットデータを実行して定期的に取得するスレッドを用意することです。次に、UIからスレッドをポーリングして、新しいメッセージを取得できます。このようにして、に何が起こってもスレッドを実行させることができますActivity

于 2010-05-04T22:01:51.707 に答える
2

タブホストにインテントロードメカニズムを使用している場合は、タスクがタブホスト自体(一時停止のみ)よりもランダムに強制終了されないことを想定して安全であり、タスク内のビューを安全に変更できます(安全に)少なくともTabHostからできるように)。

ただし、注意してください:タブホスト自体を含むすべてのアクティビティがいつでも強制終了される可能性があります(例:タスクの実行中にユーザーがタブ内のリンクをクリックして新しいアクティビティを開く場合)。タスクが戻り、現在は無効になっているアクティビティのUIを更新しようとします。したがって、破棄時にAsyncTasksをキャンセルするか、結果を返す前にアクティビティがまだアクティブであることをasynctasksに確認させるか(AndroidソースツリーのWeakAsyncTaskを参照)、アクティビティに依存しない(半)永続的なポーリング可能なバックグラウンドスレッドソリューションを使用してください。 CaseyBは提案しています(cwac-busは、その点で優れた既成のソリューションです)。

または、AsyncTaskのUI更新コードですべての例外をキャッチして(これを実行するアプリをいくつか見たことがあります)、サイレントに失敗するようにすることもできますが、それは私には面白いにおいがします。

最近、私はほとんどの場所でWeakAsyncTaskの修正バージョンを使用して、個人的に戻ったときにアクティビティが終了していないことを確認しました。

于 2010-05-04T22:09:02.387 に答える