使用firebase作业调度程序安排定期作业

时间:2016-11-01 09:39:56

标签: android firebase firebase-job-dispatcher

我试图每隔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分钟内完成一次该位置。在上面的代码中,仅为了测试目的,该值太低

3 个答案:

答案 0 :(得分:5)

还有:

Trigger.executionWindow(windowStart, windowEnd)

预计windowStartwindowEnd会在几秒钟内完成。根据您的要求,您希望窗口为10分钟。所以你应该使用类似的东西:

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

答案 1 :(得分: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客户端,该客户端提供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指定大致时间。不保证作业将在给定窗口运行。如果它错过了窗口,作业将在理想情况下最早运行。对于重复作业,一旦作业完成,下一个作业将计算从上次运行时间开始的执行窗口时间。

LINK

  

ExecutionWindow表示一次符合条件的作业触发器        当前经过的时间超过预定时间+ {@code windowStart}         值。鼓励调度程序后端使用windowEnd值作为        表示应该运行作业,但这不是强制行为。