2009-07-22 16 views
6

ここでは、次のことが挙げられます。私は、X秒(現在60秒)ごとにWebサービスを呼び出す必要のあるAndroidアプリケーションを持っています。このアプリケーションには複数のタブがあり、これらのタブはすべてデータ自体と対話する必要があります。 1つはMapViewで、1つはListViewで、3つ目は無関係ですが、最終的にはいくつかのグローバルデータを取得する必要があります。問題は、バックグラウンドで実行されるスレッドを主なアクティビティに持たせ、結果を取得して、TabHost内の両方の子アクティビティに最新のデータで自分自身を更新するよう指示することです。また、ユーザーがタブをクリックしてonCreate/onResumeアクティビティが発生すると、メインアクティビティから最新のデータを取得して強制的に再描画を行いたいと思います。私は本当にここに迷っています。私はサービスといくつかのゲットー静的メソッドを試して、アクティビティのインスタンスをサービスに渡して、タイマーが起動するたびに特定の関数を呼び出してビューを更新するようにしましたが、減速はかなり悪く、コードはちょっと醜いです。助言がありますか?Android TabAppアプリケーションでのアクティビティ間通信を実現する最善の方法

私はtabhostアクティビティのタイマー駆動スレッドとして実装しました。次に、各子アクティビティにタイマー駆動スレッドを設定して、データを(同期した形で)取得し、マップ/リストを更新します。それははるかに高速ですが、まだ少しハックっぽい感じなので、のように私は親アクティビティにカスタム関数を呼んでいる、特に一部:

((MainActivity)getParent()).getNearbyMatches(); 

これは私が完全に興奮しないんだけど強い結合の要素を追加しますパフォーマンスの観点からは、それははるかに優れています。私はすでに与えられている答えに感謝し、コンテンツプロバイダーのフロントについて少し研究しますが、私はサービスモデルに戻ってほしくないと思います。

+0

私もこれを行う方法を知って欲しい!+1 – cakeforcerberus

答えて

7

私は答えがThe Application Classと信じていることを発見しました。このクラスを拡張すると、グローバルなアプリケーションの状態を追跡できます。

AndroidManifest.xmlファイルでは、android:name属性で完全修飾カスタムクラスを参照でき、アプリケーションが起動するとインスタンス化されます。

任意のアクティビティは、"getApplication()"を呼び出すことができます。カスタムアプリケーションクラスのインスタンスが返されます。カスタムアプリケーションクラスは、好みに合わせてカスタマイズできます。

+0

、受信機クラス内で起動するべきアクティビティが既に実行されているかどうかを確認するにはどうすればよいですか? – bofredo

1

HandlerでGUIアップデートを実装し、ダウンロードスレッドにHandlerインスタンスを登録することができます。ダウンロードスレッドは、新しいデータが到着したときにハンドラにメッセージを送信します。基本的にはObserver Patternです。 Handler s hereの使い方の例を見つけることができます(「2番目のスレッドでプログレスダイアグラムの例を展開する」を展開してください)。

5

新しいデータが利用可能になるたびに、すべての子アクティビティを更新するのはなぜですか?それは私にとっては非効率的だと思う。現在表示されているアクティビティのみを更新します。

可能な方法の1つは、custom content providerです。サービスがデータソースをアクティビティに更新し、現在の可視アクティビティを取得してこのコンテンツの変更をリッスンできるようにします。つまり、OnResumeが呼び出されたときにコンテンツプロバイダに登録し、OnPauseが呼び出されたときに登録を解除します。

アクティビティの静的リファレンスを絶対に保存しないでください。あなたは醜いリークで終わるでしょう。あなたのアプリケーションのために必要ならば少なくとも使用してくださいWeakReferences

関連する問題