我有一个firebase作业调度程序,它计划在网络更改时运行,该作业在棉花糖设备(23 API级别(上运行良好,但运行时的相同代码不是在oreo设备(26 API级别(上调度作业
这是我的工作服务代码:
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters job) {
Log.d("Executing","Job");
Realm realm = Realm.getDefaultInstance();
RealmResults<JsontoSend> realmResults = realm.where(JsontoSend.class).findAll();
if(!realmResults.isEmpty()) {
for (JsontoSend jsontoSend : realmResults) {
final Intent intent = new Intent(getApplicationContext(), PostUploadIntentService.class);
intent.putExtra("object", jsontoSend.getJson());
new Thread(new Runnable() {
@Override
public void run() {
startService(intent);
}
}).run();
}
}
return true;
}
@Override
public boolean onStopJob(JobParameters job) {
Log.d("instopjob","cancelled");
return true;
}
}
这是我创建作业的代码:
synchronized public static void schedule(@NonNull final Context context){
if(sInitialized)
return;
Driver driver=new GooglePlayDriver(context);
FirebaseJobDispatcher dispatcher=new FirebaseJobDispatcher(driver);
Job myJob = dispatcher.newJobBuilder()
.setService(MyJobService.class)
.setTag(JOB_TAG)
.setRecurring(true)
.setTrigger(Trigger.executionWindow(5, 60))
.setLifetime(Lifetime.FOREVER)
.setConstraints(Constraint.ON_ANY_NETWORK)
.setReplaceCurrent(false)
.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
.build();
dispatcher.schedule(myJob);
sInitialized=true;
}
我想做的是,如果我没有互联网连接,那么将数据存储在本地数据库中,然后每当我连接到互联网时运行一个作业,并将数据与服务器同步。上面的代码在棉花糖设备上运行得很好,但在oreo设备上从未安排过作业。
这里的问题可能是因为你使用了GooglePlayDriver,它依赖于在设备上提供的google播放服务。如果服务不可用,则不会安排作业。因此,如果你的目标设备高于5.0(在大多数情况下都是这样(,你必须使用自棒棒糖以来内置的android的JobScheduler。