2016-11-01 91 views
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获取位置和发送到服务器。

我的问题:事情大多工作正常。唯一的问题是,这些工作正在按照4米,6米,7米,8米,10米,16米,23米的不同进行安排。

更新:我想在10-20分钟一次的位置。在上面的代码中,仅用于测试目的,该值太低

+1

如果工作失败,那么我想有退避。此外,我相信在那个时刻运行并不能保证。将您的退避与可变的开始时间结合起来将解释时间。你在'onStopJob()'中返回了正确的布尔值吗? –

+0

@ kranthi117你找到了答案吗? –

+0

@SharpEdge还没有:( – kranthi117

回答

1

有几个原因会导致这种情况发生。首先是你的工作返回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

+0

关于'onStopJob',我尝试了'true'和'false',没有运气。关于融合位置提供者,是的,我正在使用它来确定当前的位置 – kranthi117

+0

但是你也可以使用LocationChanged回调取代预定的作业 –

+0

我试过了你链接到的文档但是这需要一个活动的Activity或Service,打盹模式和AppStandby,这太让人头疼了 – kranthi117

1

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

LINK

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

4
另外

的:

Trigger.executionWindow(windowStart, windowEnd) 

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

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