我正试图每隔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)
期望在秒内得到windowStart
和windowEnd
。根据您的要求,您希望窗口为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.htmlExecutionWindow指定大致时间。不能保证作业将在给定的窗口上运行。如果它错过了窗口,那么在理想情况下,作业将在稍后最早的时间运行。对于循环作业,一旦作业完成,下一个作业将从上一次运行的时间作业计算执行窗口时间。
链接ExecutionWindow表示一次合格的Job触发器当前经过的时间超过计划时间+ {@code windowStart}价值。建议调度器后端使用windowEnd值作为指示作业应该运行,但这不是强制行为。