我是JobDispatcher的新手,所以我不确定我的问题是否有意义。
我有一个要求,我需要在后台定期运行一些任务(即使该应用未运行)。 任务没有在固定的时间间隔内执行。第一次执行任务时,我将了解下一个任务执行的时间表,因此,在第一次执行任务后,我应该将同一任务重新安排到以后的下一次,我将 完成任务后了解。它像这样继续下去。
这就像同步网络中的内容,网络数据会告诉您接下来何时同步。
所以,我的问题是
我应该为每个新任务每次创建一个新的工作吗?
我可以创建重复作业并继续更改时间间隔吗?
我该如何使用FireBaseJobDispatcher完全处理这种情况。
我之所以选择JobScheduler而不是FireBaseJobDispatcher,是因为我的应用还必须在Lollipop以下支持。
这是我使用FireBaseJobDispatcher尝试在给定时间执行任务的示例代码,并且工作正常。现在,我陷入了如何将其重新安排到下一个同步时间的问题。
public class MyJobService extends JobService {
private static final String TAG = "MyJobService";
@Override
public boolean onStartJob(final JobParameters job) {
// Do some work here
Log.d(TAG, "onStartJob: at "+Thread.currentThread().getName());
new Thread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "run: startign job ");
try {
Thread.sleep(2000);
// some syncing operation
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "run: job done");
// here I need to reschedule the same job to a future time
}
}).start();
return false;
}
@Override
public boolean onStopJob(JobParameters job) {
Log.d(TAG, "onStopJob: ");
return false;
}
}
我正在这样的活动中设置工作
// Create a new dispatcher using the Google Play driver.
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
Bundle myExtrasBundle = new Bundle();
myExtrasBundle.putString("some_key", "some_value");
Job myJob = dispatcher.newJobBuilder()
.setService(MyJobService.class)
.setTag("syncservice")
.setRecurring(true)
.setLifetime(Lifetime.FOREVER)
.setTrigger(Trigger.executionWindow(1*60*60 , 1*60*60)) // rigger after an hour
// don't overwrite an existing job with the same tag
.setReplaceCurrent(false)
// retry with exponential backoff
.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
.setConstraints(
Constraint.ON_ANY_NETWORK
)
.setExtras(myExtrasBundle)
.build();
dispatcher.mustSchedule(myJob);
谢谢!
答案 0 :(得分:0)
@Override
public boolean onStopJob(JobParameters job) {
Log.d(TAG, "onStopJob: ");
if(rescheduleJob)
return true; // reschedule job
else
return false; // cancel job
}
或者您可以尝试:
@Override
public boolean onStopJob(JobParameters job) {
Log.d(TAG, "onStopJob: ");
return rescheduleJob;
}