我试图每隔10分钟将android设备的位置发布到服务器。我正在使用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
获取位置并发送到服务器。
我的问题:事情大多正常。唯一的问题是,这些工作的安排距离为4米,6米,7米,8米,10米,16米,23米......
有人可以帮助我理解继续。
更新:我希望在10-20分钟内完成一次该位置。在上面的代码中,仅为了测试目的,该值太低
答案 0 :(得分:5)
还有:
Trigger.executionWindow(windowStart, windowEnd)
预计windowStart
和windowEnd
会在几秒钟内完成。根据您的要求,您希望窗口为10分钟。所以你应该使用类似的东西:
Trigger.executionWindow(10*60, 20*60)
答案 1 :(得分:4)
为什么会发生这种情况有几个原因。首先,您的工作是false
在onStopJob()
?来自文档
@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客户端,该客户端提供fused location provider的定期更新。
您可以在服务或活动上实现回调,如此
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
答案 2 :(得分:1)
ExecutionWindow指定大致时间。不保证作业将在给定窗口运行。如果它错过了窗口,作业将在理想情况下最早运行。对于重复作业,一旦作业完成,下一个作业将计算从上次运行时间开始的执行窗口时间。
ExecutionWindow表示一次符合条件的作业触发器 当前经过的时间超过预定时间+ {@code windowStart} 值。鼓励调度程序后端使用windowEnd值作为 表示应该运行作业,但这不是强制行为。