在Android中,在WorkManager的Worker类中运行asyn任务

时间:2019-03-29 07:26:34

标签: android ffmpeg rx-java rx-java2 android-workmanager

我有一个工作人员,在将其上载到服务器之前,我首先要应用FFMPEG命令。由于Worker已经在后台运行,因此在文件上传之前将结果保持不变,我使用了RxJava .blockingGet()方法。但是我无法理解如何通过RxJava等方式同步执行FFmpeg命令。我发现的一个技巧是使用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 :(得分:0)

如果您想创建一个同步作业,则需要使用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);
    }
}

对于第二个工作人员,您可以根据上传功能的行为进行相同操作以同步呼叫。

希望获得帮助。

干杯。