В Android запустите асинхронную задачу в рабочем классе WorkManager - PullRequest
0 голосов
/ 29 марта 2019

У меня есть работник, в котором я сначала хочу применить команду FFMPEG перед загрузкой на сервер. Поскольку Worker уже работает в фоновом режиме, поэтому для сохранения результата до загрузки файла я использовал метод RxJava .blockingGet (). Но я не могу понять, как выполнить команду FFmpeg синхронно, так или иначе, то есть RxJava и т. Д. Один совет, который я нашел, - это использовать ListenableWorker, но в документации сказано, что он перестает работать через 10 минут. Итак, я не хочу идти с этим решением. Ниже приведен метод FFmpeg, как и любой другой асинхронный метод. Как я могу сделать это синхронно или интегрировать его с RxJava? Любые идеи будут заметны.

 ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
                    @Override
                    public void onFailure(String s) {
                    }

                    @Override
                    public void onSuccess(String s) {
                       uploadMediaItem(mediaUpload);
                    }

                    @Override
                    public void onProgress(String s) {
                    }

                    @Override
                    public void onStart() {
                    }

                    @Override
                    public void onFinish() {

                        // countDownLatch.countDown();

                    }
                });

Это поток моего работника:

  1. проверить количество ожидающих сообщений в БД.
  2. Выберите первое сообщение и проверьте, есть ли в нем ожидающий список мультимедиа для загрузки.
  3. Рекурсивно выбирайте носитель и проверяйте, требуется ли на нем редактирование.
  4. Применение редактирования FFmpeg, загрузка и удаление из БД.
  5. Повторять цикл до последней записи в БД.

Спасибо

1 Ответ

0 голосов
/ 29 марта 2019

Если вы хотите создать синхронную работу, вам нужно использовать класс CountDownLatch (в вашем коде есть комментарий).

CountDownLatch - это объект синхронизации, который можно использовать в подобных случаях.

На данный момент не существует допустимого метода для синхронизации работников.

Прослушиваемые работники полезны, когда вы хотите отслеживать самого работника из своего приложения, используя Livedata, которые возвращают полезную информацию (например, статус). Если я правильно помню, стандартный класс Worker также происходит от Listenable worker, поэтому вы можете использовать его.

В вашем случае полезно иметь двух рабочих: первый применяет команду FFMPEG, а второй - принимает выходные данные этой команды для загрузки по сети. Разделение этих двух операций позволяет вам иметь больше времени для выполнения двух работ (10 + 10).

В вашем случае вы можете сделать что-то подобное для первого работника:

 private final CountDownLatch syncLatch = new CountDownLatch(1);
 ...ctor
 doWork(){

    //your asyncronous call
    ...
    @Override
    public void onFinish() {
//you need to save error status into a onSuccess and onFailure
        syncLatch.countDown();

     }
    ...
    //end


    syncLatch.await();

    ... 
    //evaluate if there are errors
    ...
    //create output to pass to the next worker 
    Data outputData = ...
    //pass the result to second worker, remember that onfailure will stop all subsequent workers
    if(error==true)
    {

        return Result.failure(outputData);
    }else{
        return Result.success(outputData);
    }
}

Для второго работника вы можете сделать то же самое в соответствии с вашей функцией загрузки, чтобы синхронизировать вызов.

Надеюсь, эта помощь.

Приветствие.

...