Планировщик заданий и WorkManager уничтожаются при закрытии приложения - PullRequest
0 голосов
/ 08 марта 2019

Попытка поставить сжатие видео в фоновом режиме, но приложение убивается 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;
}

1 Ответ

0 голосов
/ 26 апреля 2019

WorkManager использует JobScheduler при работе на API уровня 23+, для более старых выпусков ОС он использует комбинацию AlarmManager и BroadcastReceivers. JobScheduler на уровне API 21-22 имеет некоторые проблемы с реализацией на некоторых устройствах, и по этой причине WorkManager начинает использовать JobScheduler только на Зефире.

Таким образом, для API уровня 23+ WorkManager и JobScheduler ведут себя одинаково. Преимущество использования WorkManager заключается в том, что большинство функций доступны начиная с уровня API 14.

Что касается вашей проблемы, вы не указываете, на каком устройстве вы видите эту проблему. Вы пытались запустить образец на эмуляторе со стандартным изображением Android, чтобы проверить, сохраняется ли проблема?

Еще одна вещь, которая может повлиять на вашу фоновую работу, - это ограничение в 10 минут, которое JobScheduler (и WorkManager) накладывает на фоновую работу. Через 10 минут ваша работа остановлена.

Некоторые производители устройств решили изменить стоковую версию Android, чтобы принудительно остановить приложение. По этой причине WorkManager перестанет работать (как и JobScheduler, аварийные сигналы, широковещательные приемники и т. Д.). Нет способа обойти это. К сожалению, некоторые производители устройств делают это, поэтому в этих случаях WorkManager перестанет работать до следующего запуска приложения.

Об этом сообщается на Issetraraer WorkManager .

...