2011-02-06 3 views
0

私は毎日午後9時に更新されるウェブページからデータを取得するアプリを開発中です(AEDT時代)。 データはフェッチされた後に共有設定を使用して保存されます。Android/Java - オフセットを設定して日付を比較する

我々は、ページが、それがフェッチされた最後の時間以降に更新されていない知っていれば、データをフェッチするために無意味になるので、私は次のことを実現しようとしています:

1)データを取得するときに、現在時刻のタイムスタンププリファレンス値を設定する
2)アプリケーションがデータをフェッチするときに、現在時刻が「最後のフェッチ日付の翌午後9時」であることを確認します。
3)そうであれば、データをフェッチします。それは更新する必要はないというメッセージ。

私は、現在の日付を共有環境設定に保存できるプリミティブとして保存する方法がわかりません...おそらくSystem.currentTimeMillis()(longを返します)?これはUTCで返されます...すべての設定とチェックが同じタイムゾーンで行われていることを確認する必要があります...

どのようにして現在の時刻が "次の午後9時"?

(フェイルセーフとして、ユーザーは更新を強制するには、メニューボタンがある - アプリは更新が必要とされていない判断した場合は言及されます。)

編集:私は、私はそれを解決したと思います、まだフィードバックや提案を感謝します - 下記を参照してください。

答えて

0

このケースでは、あなたのアプリケーションにサービスを実装する必要があります。あなたのサービスで不必要なコードを実行しないようにしてください。そうしないと、ユーザーのバッテリーがヒットすることになります。このページを参照してくださいhttp://developer.android.com/reference/android/app/Service.html

+0

私はサービスがどのように役立つかわかりません...アプリケーションは現在、起動時にデータを取得しようとします。その時点で、そうするかどうかをテストするチェックを組み込みたい(つまり、ページが最後の更新のタイムスタンプ以降に更新された場合)。 – Greg

0

私は解決策を考え出しました。データをフェッチすると、以下が行われ

...

editPrefs.putLong("fetchTime", System.currentTimeMillis()); 


アプリケーションが起動し、データが正常に要求されると、それは今ん..
注:ページがあります「Australia/ACT」は、これらのゾーンが通過するタイムゾーンです)

(オーストラリア東部夏時間)午後9時に更新されます。
//create calendar date for update threshold based on last fetch time preference 
Calendar updateThresh = new GregorianCalendar(TimeZone.getTimeZone("Australia/ACT")); 
updateThresh.setTimeInMillis(prefs.getLong("fetchTime", 0)); 

//increment day if last fetch was >= 9pm of that day 
if (updateThresh.get(Calendar.HOUR_OF_DAY) >= 21) 
    updateThresh.add(Calendar.DAY_OF_MONTH, 1); 

//set time to 9:00:00pm 
updateThresh.set(Calendar.HOUR_OF_DAY , 21); 
updateThresh.set(Calendar.MINUTE , 0); 
updateThresh.set(Calendar.SECOND , 0); 

//check if current date is before or after 
if (updateThresh.before(new GregorianCalendar(TimeZone.getTimeZone("Australia/ACT")))) 
{ 
    //update needed (fetch data) 
} 
else 
{ 
    //update not needed (show message) 
} 

これは正常に動作するようです。私はオーストラリア/ ACTに設定されたDateFormatを使ってテストしました。フェッチ時に設定されている別のカレンダーオブジェクトを作成し、使用して:これは私が自分の携帯電話のタイムゾーンの設定をいじっても、一貫して正しい出力を示し

DateFormat df = DateFormat.getDateTimeInstance(); 
df.setTimeZone(TimeZone.getTimeZone("Australia/ACT")); 

testTextField.setText("Last fetch in East AU time: " + df.format(fetchTime.getTimeInMillis()) + 
    "\nUpdate threshold in East AU time: " + df.format(updateThresh.getTimeInMillis())); 

...私は、このソリューションの作品はかなり確信していますだから、私はそれを正しい/受け入れているとマークします - しかし、誰かがエラーに気づいたり、より良い提案があれば、気軽に投稿してください! :)

+0

なぜ午後9時にはカレンダーを一定にしないのですか?オーストラリアの時間と現在の時間をその時間と比較する? – bbaja42

+0

それは本質的に私がやったことではありませんか?私は、現在の日または翌日のいずれかにする必要があるので、ちょうど "午後9時のオーストラリアの時間"が働くことは確かではありません... – Greg