web-dev-qa-db-ja.com

Firebase JobDispatcherを使用して定期的なジョブをスケジュールする

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回場所が必要です。上記のコードでは、テスト目的のためだけに値が低すぎます

12
kranthi117

また:

Trigger.executionWindow(windowStart, windowEnd)

windowStartwindowEndを数秒で期待します。要件に応じて、ウィンドウを10分にする必要があります。したがって、次のようなものを使用する必要があります。

Trigger.executionWindow(10*60, 20*60)
5
Mahesh

これが発生する可能性がある理由はいくつかあります。まず、あなたの仕事は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

4
Graham Smith

ExecutionWindowはおおよその時間を指定します。特定のウィンドウでジョブが実行されることは保証されていません。ウィンドウを逃した場合、理想的な状況では、ジョブは最も早い時間に実行されます。ジョブが終了すると、次のジョブは、ジョブが最後に実行された時間から実行ウィンドウ時間を計算します。

[〜#〜]リンク[〜#〜]

ExecutionWindowは、現在の経過時間がスケジュールされた時間+ {@codewindowStart}値を超えると適格になるジョブトリガーを表します。スケジューラバックエンドは、ジョブを実行する必要があることを示すシグナルとしてwindowEnd値を使用することをお勧めしますが、これは強制的な動作ではありません。

1