0

毎日午後 9 時 (AEDT 時間) に更新される Web ページからデータを取得するアプリに取り組んでいます。データは、取得後に共有設定を使用して保存されます。

ページが最後に取得されてから更新されていないことがわかっている場合、データを取得しても意味がないため、次のことを実装しようとしています。

1) データがフェッチされるとき、現在時刻のタイムスタンプ設定値を設定します
2) アプリがデータをフェッチするときに、現在の時刻が「最後のフェッチ日の次の午後 9 時以降」であるかどうかを確認します
3) もしそうであれば、データをフェッチします。それ以外の場合は、更新する必要がないというメッセージを表示します。

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

次に、現在の時刻が「次の午後 9 時」の更新しきい値を超えているかどうかを確認するにはどうすればよいですか?

(フェールセーフとして、ユーザーには更新を強制するためのメニュー ボタンがあります。これは、更新が不要であるとアプリが判断した場合に表示されます。)

編集:私はそれを解決したと思いますが、それでもフィードバックや提案をいただければ幸いです-以下を参照してください。

4

2 に答える 2

0

私は解決策を思いついたと思います。

データを取得すると、次のようになります。

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


アプリケーションが起動し、データが通常要求されると、現在は更新されます。
注: ページは毎日「午後9時AEDT」-(オーストラリア東部夏時間)に更新され、AEST(オーストラリア東部標準時間)に変更されると思います。 )夏時間が終了したとき。「オーストラリア/ ACT」は、これらのゾーンを通過するタイムゾーンです)

//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)
}

これはうまくいくようです。Australia / 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()) );

これにより、携帯電話のタイムゾーン設定を試してみても、一貫して正しい出力が表示されます...このソリューションは機能すると確信しているので、正しい/承認済みとマークします-しかし、誰かがエラーに気付いた場合、またはより良い提案、貢献してください!:)

于 2011-02-06T07:11:28.783 に答える
0

この場合、アプリにサービスを実装する必要があると思います。サービスで不要なコードを実行しないように注意してください。そうしないと、ユーザーのバッテリーが消耗します。このページを参照してくださいhttp://developer.android.com/reference/android/app/Service.html

于 2011-02-06T04:21:06.783 に答える