12

我正在尝试每 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获取位置并发送到服务器。

我的问题:事情大部分都很好。唯一的问题是,工作安排的时间差为 4m、6m、7m、8m、10m、16m、23m ......

有人可以帮助我理解正在发生的事情。

更新:我想在 10-20 分钟内找到一次。在上面的代码中,值太低只是为了测试目的

4

3 回答 3

5

还有:

Trigger.executionWindow(windowStart, windowEnd)

预计windowStartandwindowEnd以秒为单位。根据您的要求,您希望窗口为 10 分钟。所以你应该使用类似的东西:

Trigger.executionWindow(10*60, 20*60)
于 2017-05-09T00:26:13.877 回答
4

发生这种情况的原因有几个。首先,你的工作回来falseonStopJob()吗?从文档

@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

于 2016-11-01T09:52:04.077 回答
1

ExecutionWindow 指定大致时间。不能保证作业将在给定窗口运行。如果错过了窗口,则作业将在理想情况下最早运行。对于重复作业,一旦作业完成,下一个作业将根据作业上次运行的时间计算执行窗口时间。

关联

ExecutionWindow 表示一个 Job 触发器,一旦当前经过的时间超过预定时间 + {@code windowStart} 值,该触发器就会成为合格的。鼓励调度程序后端使用 windowEnd 值作为应该运行作业的信号,但这不是强制行为。

于 2017-02-08T12:07:41.297 回答