使用firebase作业调度器调度循环作业



我正试图每隔10分钟将android设备的位置发布到服务器。我正在使用firebase job dispatcher

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获取位置并发送给服务器。

我的问题是:一切都很好。唯一的问题是,工作安排的差异是4米,6米,7米,8米,10米,16米,23米…

有谁能帮我理解一下这是怎么回事吗

更新:我想要10-20分钟一次的位置。在上面的代码中,这个值对于测试来说太低了

Trigger.executionWindow(windowStart, windowEnd)

期望在秒内得到windowStartwindowEnd。根据您的要求,您希望窗口为10分钟。所以你应该使用如下代码:

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

发生这种情况有几个原因。首先,你的工作是否在onStopJob()中返回false ?从docs

@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 )

此外,我将为您正在做的事情使用调度作业。看看Google API客户端,它提供了来自融合位置提供者的定期更新。

你可以在你的服务或活动上实现一个回调,像这样

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表示一次合格的Job触发器当前经过的时间超过计划时间+ {@code windowStart}价值。建议调度器后端使用windowEnd值作为指示作业应该运行,但这不是强制行为。

最新更新