Androidデバイスの場所を10分ごとにサーバーに投稿しようとしています。これを行うために、firebaseジョブディスパッチャーを使用しています
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
Job myJob = dispatcher.newJobBuilder()
.setService(UpdateLocationService.class)
.setRecurring(true)
.setTrigger(Trigger.executionWindow(10, 20))
.setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
.setTag("location-update-job")
.setLifetime(Lifetime.FOREVER)
.build();
dispatcher.mustSchedule(myJob);
UpdateLocationService
は場所を取得し、サーバーに送信します。
私の問題:物事はほとんど正常に機能しています。唯一のことは、ジョブは4m、6m、7m、8m、10m、16m、23mの違いでスケジュールされています...
誰かが私が起こっていることを理解するのを手伝ってくれませんか。
更新:10〜20分に1回場所が必要です。上記のコードでは、テスト目的のためだけに値が低すぎます
また:
Trigger.executionWindow(windowStart, windowEnd)
windowStart
とwindowEnd
を数秒で期待します。要件に応じて、ウィンドウを10分にする必要があります。したがって、次のようなものを使用する必要があります。
Trigger.executionWindow(10*60, 20*60)
これが発生する可能性がある理由はいくつかあります。まず、あなたの仕事はonStopJob()
でfalse
を返しますか?ドキュメントから
_@Override
public boolean onStopJob(JobParameters job) {
return false; // Answers the question: "Should this job be retried?"
}
_
ジョブを再試行する必要がある場合は、バックオフが適用されます。これを、10〜20秒ごとに再度実行するという事実と組み合わせると、発生している結果が得られる可能性があります。
ジョブに制約を設定していません。これは、ジョブの実行時期にも影響します。例えば.
.setConstraints( // only run on an unmetered network Constraint.ON_UNMETERED_NETWORK, // only run when the device is charging Constraint.DEVICE_CHARGING )
さらに、私はあなたがしていることにスケジュールされたジョブを使用しません。 融合ロケーションプロバイダー から定期的に更新を提供するGoogleAPIクライアントを見てください。
このようにサービスまたはアクティビティにコールバックを実装できます
_public class MainActivity extends ActionBarActivity implements
ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
...
@Override
public void onLocationChanged(Location location) {
mCurrentLocation = location;
mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
updateUI();
}
private void updateUI() {
mLatitudeTextView.setText(String.valueOf(mCurrentLocation.getLatitude()));
mLongitudeTextView.setText(String.valueOf(mCurrentLocation.getLongitude()));
mLastUpdateTimeTextView.setText(mLastUpdateTime);
}
}
_
ここで完全なドキュメントを確認してください。ただし、達成しようとしていることに特化したサービスを使用すると、より一貫したエクスペリエンスが得られると思います。
https://developer.Android.com/training/location/receive-location-updates.html
ExecutionWindowはおおよその時間を指定します。特定のウィンドウでジョブが実行されることは保証されていません。ウィンドウを逃した場合、理想的な状況では、ジョブは最も早い時間に実行されます。ジョブが終了すると、次のジョブは、ジョブが最後に実行された時間から実行ウィンドウ時間を計算します。
ExecutionWindowは、現在の経過時間がスケジュールされた時間+ {@codewindowStart}値を超えると適格になるジョブトリガーを表します。スケジューラバックエンドは、ジョブを実行する必要があることを示すシグナルとしてwindowEnd値を使用することをお勧めしますが、これは強制的な動作ではありません。