android - 在 Android 中,在 WorkManager 的 Worker 类中运行异步任务

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

我有一个 Worker,我首先要在其中应用 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();

                    }
                });

这是我的 worker 的流程:
  • 检查数据库中的待处理帖子计数。
  • 选择第一个帖子并检查它是否有待上传的媒体列表。
  • 递归选择媒体并检查是否需要对其进行编辑。
  • 应用 FFmpeg 编辑并从数据库中上传和删除。
  • 重复循环直到数据库中的最后一个条目。

  • 谢谢

    最佳答案

    如果您想创建一个同步作业,您需要使用 CountDownLatch 类(代码中有注释)。

    CountDownLatch 是一个同步对象,可以在这种情况下使用。

    至于现在没有一个有效的方法来拥有同步工作人员。

    当您想使用返回有用信息(例如状态)的 Livedata 从您的应用程序监控工作人员本身时,可监听工作人员非常有用。
    如果我没记错的话,标准的 Worker 类也来自 Listenable worker ,所以你可以使用它。

    在您的情况下,有两个工作人员很有用:第一个应用 FFMPEG 命令,第二个工作人员使用此命令的输出进行网络上传。将这两个操作分开可以让您有更多的时间来完成这两个工作(10 + 10)。

    在您的情况下,您可以为第一个 worker 做这样的事情:

     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);
        }
    }
    

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

    希望这有帮助。

    干杯。

    关于android - 在 Android 中,在 WorkManager 的 Worker 类中运行异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55412404/

    相关文章:

    android - 区分两个独立 SMS 的发送报告

    android - Gradle 构建工具找不到 play-services-tasks.aar?为什么?

    ffmpeg - 将 MP4 转换为 WebM,效果不佳

    ffmpeg - 如何计算在特定 FPS 下提取的帧数?

    kotlin - 如何将 rxjava2 Zip 函数(从 Single/Observable)的数量概括为 n 个 Nullable 参数而不丢失其类型?

    scala - combineLatest 仅在其中一个流发生变化时发出

    android - 如何在布局下方显示 viewpager?

    c# - 图像序列到视频流?

    java - 使用 in flight observable 加入 rxjava 订阅的正确方法

    android - 用户滑动页面时如何设置另一个 fragment 的edittext值?