2

学生用のアプリケーションでバックグラウンドサービスにマークをダウンロードし、前回よりも多くのマークがあるかどうかを確認します。新しいマークがある場合は通知をプッシュし、sharedPreferencesにマークの数を書き換えます。それは動作しますが、同時に同じマークの通知が複数同時にを作成します。AndroidサービスsetInexactRepeating SharedPreferencesを使用したasyncTaskの問題

放送受信トリガIntentService

public int onStartCommand(Intent intent, int flags, int startId) { 
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(getApplicationContext(), CheckNewMarksReceiver.class); 
    PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0); 

    alarmManager.setInexactRepeating(
      AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      0, 
      2500, alarmIntent); 

    return START_STICKY; 
} 

放送受信onReceive方法はsharedPreferences属性初期化numberOfMarksSavedとはAsyncTaskを開始し、そのダウンロードデータ:

DownloadDataTask task = new DownloadDataTask(); 
task.execute(context.getString(R.string.LOGIN_PAGE_URL), username, password); 

dataPreferences = context.getApplicationContext().getSharedPreferences(context.getString(R.string.SHARED_PREFERENCES), Context.MODE_PRIVATE); 
numberOfMarksSaved = dataPreferences.getInt(context.getString(R.string.PREFERENCE_NUMBER_OF_MARKS_KEY), -1); 

AsyncTasks onPostExecuteの方法チェックダウンロードマークの数が前回よりも大きい場合:私が言ったように、

if (numberOfDownloadedMarks > numberOfMarksSaved) { 
    ... 
    notifyUserAbout(newMarks, response); // method to fire a notification 
} 

dataPreferences 
    .edit() 
    .putInt(context.getString(R.string.PREFERENCE_NUMBER_OF_MARKS_KEY), 
      numberOfDownloadedMarks) 
    .apply(); 

これはほとんど動作し、時にはBroadcastReceiverは直ちに2回連続をトリガさ - 最初の値を書き換えますsharedPreferencesでは2番目の値は共有環境設定の値が変更されたことを「認識」しません。どうすればそれを防ぐことができますか?

EDIT: 私もsetInexactRepeatingの代わりにsetRepeatingない試してみました - 何も変更された(私はアンドロイドalarmManager時間シフトを疑います)。ここに私のログは次のとおりです。

06-11 18:14:14:

06-11 18新しいデータをダウンロード:27.761 ...私は/ジャストに約27.732 ... I /ジャスト約: 14::新しいデータに

06-11 18をダウンロード27.907 ... I /保存&新しい:89、90

06-11 18:14:27.933 ... I /通知が焼き - ID:1077819997

06-11 18:14:28.004 ... I/Saved &新規:89,90

06-11 18:14:28.006 ... I /通知焼き - ID:1077820069

+0

inexactRepeatingから繰り返すように変更されたという回答がありました。それは助けになりませんでした。 – cuddlecheek

答えて

1

のため、どのように不正確な繰り返しアラームが動作し、長時間実行されるバックグラウンド処理は、おそらくで実行されている複数のAsyncTaskインスタンスがあります問題が発生したときと同じです。 AlarmManagerのドキュメントから

あなたのアラームの最初のトリガが要求された時間の前にされませんが、 その時間後にはほぼ完全な間隔で発生しない可能性があります。 に加えて、繰り返しアラームの全期間は と要求されますが、アラームの連続した2回の起動の間の時間は異なります。 このような低い区間については

私はあなたのServiceであなたのAsyncTaskのインスタンスを保つsetRepeating()代わりのsetInexactRepeating()

を使用することをお勧めしたいです。同時にあなたのAsyncTaskランニングの複数のインスタンスを防ぐために

if(task.getStatus == AsyncTask.Status.FINISHED) { 
    task = new DownloadDataTask(); 
    task.execute(context.getString(R.string.LOGIN_PAGE_URL), username, password); 
} 

その後、あなたはこのような何かを行うことができます。

+0

私はこのサービスでpostDelayedを使ってHandlerでこれを使用しましたが、それは魅力的です。どうもありがとうございました。 – cuddlecheek

関連する問題