我有一个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;
}
我想做的是如果我没有Internet连接,然后将数据存储在本地数据库中,然后每当我连接到Internet并与服务器同步数据时就运行一个作业。以上代码在棉花糖设备上运行良好但工作从未在oreo设备上安排。
答案 0 :(得分:0)
这里的问题可能是因为您使用的GooglePlayDriver依赖于要在设备上显示的google play服务。如果服务不可用,则不会安排作业。 因此,如果您定位到高于5.0的设备(在大多数情况下是这样),则必须使用自棒棒糖以来内置的android JobScheduler。