2011-12-20 19 views
0

私は、Webサービスによって返される値に依存するAndroidアプリケーションを持っています。この値は1週間に1回しか変更されません。クライアントはこの変更された値を検出する必要がありますが、この変更が検出された正確な時間は実際には重要ではありません.12〜24時間後は問題ありません。AndroidカスタムアプリケーションクラスのonCreate()メソッドで実行される操作をスケジュールする必要がありますか?

現在の実装では、Webサービスから値を取得するカスタムアプリケーションクラスのonCreate()メソッドでIntentServiceが開始されます。 SharedPreferencesで最後に取得した値も保持するので、アプリケーションはこの値が取得されるまで待つ必要はありません。

私の質問は、onCreate()メソッドで最初に取得した後にこの値の取得をスケジュールする必要がある場合です.12時間後に言うことができます。 onCreate()メソッドはアプリケーションのライフサイクルで一度しか呼び出されませんが、アプリケーションがAndroidシステムによってどのくらい終了する可能性があるのか​​わかりません。スケジューリングが必要ないようにアプリケーションが十分に終了すると仮定することは合理的ですか?そして、私は手術をスケジュールする必要がある場合、これを達成するための最良の方法は何でしょうか?

+0

onCreateを使用した場合、2度目の呼び出しが保証されないと思います。例えば。ユーザーが携帯電話を充電して充電すると、スリープ状態になり、アプリが終了して数日間放置されます。非常にありそうもないが不可能ではない。もし私があなただったら私はある種のスケジュールされた仕事を設定しました。 http://developer.android.com/resources/articles/timed-ui-updates.htmlなど、このリンクが役立つかもしれません。 –

+0

あなたが概要を説明したシナリオが、私がこの質問をした理由です。ハンドラーとリンクされた記事のpostDelayed()メソッドを使用したコード例は、私にとってはうまく見えます。 –

+0

リンクされた記事に記載されているソリューションを実装します。これをあなた自身の答えに入れると、私はあなたの答えを受け入れます。もしそうでなければ、私は自分の質問に後で答えます。 –

答えて

1

onCreate()を使用した場合、2度目の保証はないと思います。例えば。ユーザーが携帯電話を充電して充電すると、スリープ状態になり、アプリが終了して数日間放置されます。非常にありそうもないが不可能ではない。

私があなただったら、何らかのスケジュールされたタスクを設定します。たぶん、このリンクが役立ちます:

http://developer.android.com/resources/articles/timed-ui-updates.html

の例では、タスクをキャンセルするOnClickListenerを使用しています。

OnClickListener mStopListener = new OnClickListener() { 
    public void onClick(View v) { 
     mHandler.removeCallbacks(mUpdateTimeTask); 
    } 
}; 

これはおそらくonDestroy()に置きます。

+0

私はこれを実装しました、魅力のように動作します。私は、アプリケーションクラスのonTerminate()メソッドでhandler.removeCallbacks()を呼び出しました。しかし、アプリケーションが終了した場合、アプリケーションのメインスレッドも閉じられ、このスレッドメッセージキュー内のすべてのポストされたメッセージも削除されるため、これは本当に必要ではないと私は考えています。 –

+0

うーん、投稿されたメッセージについてはわからない。私は可能ならば明示的に削除します。また、 'Application.onTerminate()'は動作保証されません。*実稼働のAndroidデバイスでは決して呼び出されません。* - http://developer.android.com/reference/android/app/Application.html#onTerminate% 28%29。 –

+0

onTerminate()に関する良い点、私はそれを知らなかった。メッセージを削除するには:http://developer.android.com/reference/android/os/Handler.html#postDelayed%28java.lang.Runnable、%20long%29メッセージは、ルーパーが終了した場合に削除されます。プロセスが強制終了された場合に発生します。 –

0

私は同様の設計上の課題があったため、いくつかの選択肢があります。どちらも長所と短所があります。

オプション

あなたは多くのアプリのように、スプラッシュスクリーンを持ち、Webリクエストを作成し、共有設定を更新するasyncTaskクラスを使用することができます。カスタムタイムアウトを設定して、スプラッシュ画面に長時間放置されないようにすることができます。どんな結果であっても、それが更新されたかどうかにかかわらず、sharedPreferencesにロードされたものをロードして、その実行でのアプリの使用にそれを使用することができます。

良いことは、アプリが起動するたびに、データが最新であるかどうかを気にする必要がなくなるため、すぐに取得して取得することです。パフォーマンスの更新のために、sharedPrefの値が最後に更新されたとき(たとえば、12時間前に値を取得した場合)に保存してWebリクエストをスキップすることもできます。その結果、スプラッシュ画面がすぐに出かけるようになります。あなたはこれが不要な電池消耗になりサービスよりもはるかに良いだろう、AlarmManager経由でアラームを使用することができます

オプションB

。 "INTERVAL_DAY"の日のインターバルについてもenumがあります。アラームがトリガーされると、ブロードキャスト受信者はWebリクエストを行い、値を取得して保存するカスタムコードを実行します。アラームの繰り返しが1回の使用であるかどうかを指定できます。

希望に役立ちます。

EDIT:妥当性から選択したものだけがあります。

+0

私のアプリはスポーツ結果を表示するだけなので、スプラッシュ画面を使用したくないので、ユーザーは必要ない場合を待たずにいます。さらに、オプションAは、私の質問に対する彼のコメントでPaul Grimeが概説したシナリオを扱っていない。オプションBは私の問題をうまく処理する素晴らしい方法ですが、私のニーズにはそれほど複雑ではないと思います。とにかくあなたに感謝します。 –

関連する問題