You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RxJava2视频上传流程问题:标记完成API未触发求助

问题分析与修复方案

从你的代码和描述来看,核心问题是executeMarkvideoCompletedUseCase方法中的API调用没有触发——虽然方法被执行了,但实际的标记完成请求并未发送。结合RxJava2的流特性,我整理了几个可能的原因和对应的修复方案:

可能的问题根源

  1. 异步操作未纳入Rx流管理:如果mMarkvideoCompletedUseCase.execute()是异步操作(比如内部调用了Retrofit的异步接口),你用Completable.fromAction()包裹它的方式会导致Rx不会等待异步操作完成,直接执行后续逻辑,API请求可能还没触发就结束了。
  2. UseCase的execute()未返回Rx类型:如果你的UseCase只是内部创建了流但没有返回,外部无法将其纳入整个Rx链,导致API请求的流从未被订阅执行。
  3. 线程调度不匹配:如果API请求需要在IO线程执行,但当前流的线程是主线程,可能导致请求被阻塞或静默失败。

具体修复步骤

1. 修正executeMarkvideoCompletedUseCase的实现

假设你的标记完成API是无返回的操作,应该让UseCase返回Completable,并直接将其纳入Rx流:

private Observable<video> executeMarkvideoCompletedUseCase() {
    mMarkvideoCompletedUseCase.setvideo(mvideo);
    // 直接使用UseCase返回的Completable,确保Rx等待API调用完成
    return mMarkvideoCompletedUseCase.execute()
            .subscribeOn(Schedulers.io()) // 强制API调用在IO线程执行
            .andThen(Observable.just(mvideo));
}

2. 调整UseCase的execute()方法

让MarkvideoCompletedUseCase的execute()返回Rx类型(比如Completable),而不是void,确保流能被外部订阅:

public class MarkvideoCompletedUseCase {
    private final VideoApi mVideoApi;
    private video mTargetVideo;

    public void setvideo(video video) {
        this.mTargetVideo = video;
    }

    // 返回Completable,让外部Rx链管理订阅和线程
    public Completable execute() {
        if (mTargetVideo == null || mTargetVideo.getRemoteId() == null) {
            return Completable.error(new IllegalArgumentException("Video or remote ID is null"));
        }
        return mVideoApi.markVideoAsCompleted(mTargetVideo.getRemoteId())
                .subscribeOn(Schedulers.io());
    }
}

3. 优化整个Rx流的线程调度

在executeUseCases()的流开头添加线程调度,确保整个上传流程在IO线程执行,避免主线程阻塞:

private void executeUseCases() { 
    broadcastEvent(getvideoUploadInitialEvent()); 
    compositeDisposable.add(executePostvideoUseCase()
            .subscribeOn(Schedulers.io()) // 整个流在IO线程执行
            .observeOn(AndroidSchedulers.mainThread()) // 事件回调切换到主线程(用于UI更新)
            .flatMap(createdvideo -> {
                LogDnaLogger.info("executePostvideoUseCase -> createdvideo : " + createdvideo.toString());
                updatevideo(createdvideo.getRemoteId(), createdvideo.getvideoSegmentList());
                broadcastEvent(getvideoCreatedEvent());
                return Observable.just(createdvideo); // 传递最新的video对象,而非成员变量mvideo
            })
            // ... 后续flatMap逻辑保持不变
            .flatMap(o -> executeMarkvideoCompletedUseCase())
            .subscribe(
                voidResponse -> {
                    LogDnaLogger.info("video Upload Completed ");
                    broadcastEvent(getvideoUploadSuccessEvent());
                }, 
                throwable -> {
                    Timber.e("video Upload Failed with Exception : " + Log.getStackTraceString(throwable));
                    videoUploaderEvent event = getvideoUploadFailureEvent();
                    LogDnaLogger.info("Upload Failed video : " + event.toString());
                    broadcastEvent(event);
                }
            )
    ); 
}

4. 排查异常吞灭问题

在标记完成的步骤添加doOnError,提前捕获可能的异常,避免流静默中断:

.flatMap(o -> executeMarkvideoCompletedUseCase())
.doOnError(throwable -> Timber.e("Mark video completed failed: %s", Log.getStackTraceString(throwable)))
.subscribe(...)

额外优化建议

  • 避免在flatMap中返回成员变量mvideo,尽量传递上游流中的最新video对象,保证状态一致性;
  • 使用lambda替代匿名内部类,让Rx链更简洁易读;
  • 确保所有分片上传的executeUploadVideoUseCase返回的Observable能正确发出完成信号,这样toList()才能正确收集所有结果,触发后续的标记完成逻辑。

内容的提问来源于stack exchange,提问作者Sandeep Agrawal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:02:27