【问题标题】:In Android run asyn task inside Worker class of WorkManager在 Android 中,在 WorkManager 的 Worker 类中运行异步任务
【发布时间】:2019-03-29 07:26:34
【问题描述】:

我有一个 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 的流程:

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

谢谢

【问题讨论】:

  • RxWorker 它是 ListenableWorker 的子级,并且具有相同的 10 分钟任务长度限制。如果您需要更长时间地运行后台任务,WorkManager 可能不是正确的解决方案。了解您在这里想要实现的目标会有所帮助。
  • 好点,任何工人都是 ListenableWoker 的孩子,因此有 10 分钟的限制。我只想上传帖子,上面提到了流程。根据您的建议,最好的解决方案是什么?
  • 你可以看看Background processing Guide。在您的特定情况下,前台服务看起来很合适。
  • 但是服务没有“网络已连接”等限制。我只想在网络可用时运行它

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


【解决方案1】:

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

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

目前还没有有效的方法让同步工作人员。

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

在您的情况下,拥有两个工作人员很有用:第一个应用 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);
    }
}

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

希望对您有所帮助。

干杯。

【讨论】:

  • 感谢您的回复。但是我尝试了 LatchCount,它让 Worker 处于暂停状态,但 ffmpeg 也不起作用并且卡住了。这就是我删除这种方法的原因。
  • 如果我理解正确,您的 ffmpeg 命令需要很长时间才能执行,因此不会调用任何方法(onSuccess、onFailure)并且您仍然被阻止。我对吗?检查此链接是否可以帮助您因为与您的主题相似stackoverflow.com/questions/51756305/…
  • 如何在我的情况下使用它。流程是:i-检查数据库中的待处理帖子计数。 ii- 选择第一个帖子并检查它是否有待上传的媒体列表。 iii- 递归选择媒体并检查是否需要对其进行编辑。 iv- 应用 FFmpeg 编辑并从数据库中上传和删除。 v- 重复循环,直到数据库中的最后一个条目。
猜你喜欢
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多