试图将视频压缩置于后台,但应用WorkManager
和JobSchedular
被销毁
如何解决此问题?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ComponentName componentName = new ComponentName(ConcatVideoActivity.this, ConcatVideoJobServiceRepository.class);
JobInfo jobInfo;
PersistableBundle bundle = new PersistableBundle();
bundle.putString(FIRST_IMG, doctorCredentialModel.getDoctorFrontimg().replaceAll(" ", "%20"));
bundle.putString(LAST_IMG, doctorCredentialModel.getDoctorBackimg().replaceAll(" ", "%20"));
bundle.putString(VIDEO_URL, doctorCredentialModel.getVidUrl());
if(doctorCredentialModel.getDoctorName()!=null){
bundle.putString(DR_NAME, doctorCredentialModel.getDoctorName());
}else{
bundle.putString(DR_NAME,getString(R.string.app_name));
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
jobInfo = new JobInfo.Builder(12, componentName)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true)
.setExtras(bundle)
.build();
} else {
jobInfo = new JobInfo.Builder(12, componentName)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true)
.setExtras(bundle)
.build();
}
try {
JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
int resultCode = jobScheduler.schedule(jobInfo);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.d("JOB SECHEDULED", "Job scheduled!");
} else {
Log.d("JOB NOT SECHEDULED", "Job not scheduled");
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onStartJob(JobParameters jobParameters) {
Log.d(TAG, "Job started!");
firstImg = jobParameters.getExtras().getString(FIRST_IMG);
secondImg = jobParameters.getExtras().getString(LAST_IMG);
videoUrl = jobParameters.getExtras().getString(VIDEO_URL);
drName = jobParameters.getExtras().getString(DR_NAME);
loadFFMpegBinary(jobParameters);
isWorking = true;
// We need 'jobParameters' so we can call 'jobFinished'
// startConcatVideo(jobParameters); // Services do NOT run on a separate thread
Toast.makeText(this, "Video Customization InProgress ", Toast.LENGTH_SHORT).show();
return isWorking;
}
答案 0 :(得分:0)
WorkManager在API Level 23+上运行时使用JobScheduler,对于较旧的OS版本,它结合使用AlarmManager和BroadcastReceivers。 API级别21-22上的JobScheduler在某些设备上存在一些实现问题,这就是WorkManager开始仅在棉花糖上使用JobScheduler的原因。
因此,对于API级别23 +,WorkManager和JobScheduler的行为相同。使用WorkManager的好处是,大多数功能从API级别14开始可用。
关于您的问题,您没有指定在哪个设备上看到此问题。您是否尝试过在带有模拟器图像的模拟器上运行示例,以查看问题是否仍然存在?
可能会影响您的后台工作的另一件事是JobScheduler(和WorkManager)对后台工作施加的10分钟限制。 10分钟后,您的工作停止了。
一些设备制造商已决定修改库存Android,以强制停止该应用。这就是WorkManager停止工作的原因(JobScheduler,警报,广播接收器等也将停止工作)。没有办法解决此问题。不幸的是,某些设备制造商会这样做,因此在这种情况下,WorkManager将停止工作,直到下次启动该应用程序为止。
这是在WorkManager's issuetracker上报告的。