2012-01-08 10 views
0

私はタイムテーブルをダウンロードして保存するアプリを持っており、このタイムテーブルの変更を定期的にダウンロードしています。私は現在シングルトンを使用していますが、私はこれをデザインの観点から見ていません。ダウンロードのために、ネットワークの使用を最小限に抑えるために集中化されたシステムが必要です。アプリからウィジェットを更新するには?

シングルトンからの更新を必要とするすべてのクラスは、最初にこのシングルトンのインスタンスを取得し、更新が必要なときに特定のメソッドが呼び出されるインターフェイスを提供します。現在、シングルトンはワーカースレッドのすべてのダウンロードを処理します。通常、アクティビティから呼び出されたAsyncTaskを使用しますが、結果をウィジェットにも送信する必要があるため、この作業は表示されません。

代わりに、サービスを使用しています。ウィジェットとアクティビティの両方からバインドするだけです。この場合の問題は、私がBroadcastReceiver(AppWidgetProvider)からバインドできないことです。問題は私のウィジェットを定期的に更新できないことです。

私の質問は、サービスからウィジェットを更新して(シングルトンを取り除くため)、またはより良い方法があるように、私のアプリを設計する方法(または:できますか)です多分BroadcastReceivers)?

答えて

1

サービスから自分のウィジェットを更新できるように(またはシングルトンを取り除くために)私のアプリをデザインするにはどうすればよいですか(または、おそらくBroadcastReceivers )?

アプリウィジェットを更新するには、AppWidgetManagerupdateAppWidget()に電話してください。これは、AppWidgetProviderからではなく、いつでも実行できます。

アプリウィジェットを定期的に更新するには、アプリウィジェットのメタデータにandroid:updatePeriodMillisを使用するか、自分でAlarmManagerを直接設定してください。どちらの場合でも、IntentServiceに作業を委託したい場合は、ではなく、メインアプリケーションスレッドで何かしたいことがありますか?IntentServiceは、バックグラウンドスレッドを提供し、作業あなたが積極的に仕事をしている場合を除いて、あなたはRAMを使いません。

一般的に定期的に作業を行うには、AlarmManagerIntentServiceを使用してください。 IntentServiceは、仕事の一環として、必要に応じてアプリウィジェットを更新することができます。

+0

特定の時刻にダウンロードを実行する必要はないため、AlarmManagerの代わりにハンドラを使用します。そうでなければ:ありがとう、それは明らかに割り当て。 – Boude

+1

@Boude: "特定の時刻にダウンロードを実行する必要はないので、AlarmManagerの代わりにHandlerを使用します" - プロセスが終了すると、 'Handler'がなくなります。 'AlarmManager'は、あなたのUIがフォアグラウンドになくてもそれらのダウンロードが起こるはずであれば、定期的にダウンロードするほうがはるかに良い解決策です。 – CommonsWare

+0

ウィジェットが表示されたら、ダウンロードを実行する必要があります。アクティビティとウィジェットの両方が表示されていない場合にのみ、ダウンロードは不要です。私は私のアルファをテストしている間に両方を試してみるだろうと思って、いくつかのユーザー体験に基づいて私の決定をする。私はあなたの議論を非常に慎重に検討します、ありがとうございます。 – Boude

関連する問題