我有一个工作人员,在将其上载到服务器之前,我首先要应用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();
}
});
这是我的工作人员的流程:
谢谢
答案 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);
}
}
对于第二个工作人员,您可以根据上传功能的行为进行相同操作以同步呼叫。
希望获得帮助。
干杯。