RxJava串行执行任务

Posted 白玉梁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RxJava串行执行任务相关的知识,希望对你有一定的参考价值。

RxJava是什么不在多说,上一篇讲过RxJava的并发请求实现:RxJava的并发,这一篇讲RxJava串行的实现,主要用到contactcontactArray操作符,直接上代码:

        Observable<Integer> task1 = Observable.create(emitter -> 
            //...
            //这里执行一些任务
            //执行完成后发射到下一个任务并通知本任务完成
            emitter.onNext(1);
            emitter.onComplete();
        );
        Observable<Integer> task2 = Observable.create(emitter -> 
            //...
            //这里执行一些任务
            //执行完成后发射到下一个任务并通知本任务完成
            emitter.onNext(2);
            emitter.onComplete();
        );
        Observable<Integer> task3 = Observable.create(emitter -> 
            //...
            //这里执行一些任务
            //执行完成后发射到下一个任务并通知本任务完成
            emitter.onNext(3);
            emitter.onComplete();
        );

使用contact执行:

        Observable.concat(task1,task2,task3)
                .subscribeOn(androidSchedulers.mainThread())
                .subscribe(index -> 
                    LogUtil.e("index>>" + index);
                );

执行结果:

这是一个最原始最基础的例子,非常简单了!

contact和contactArray的区别是:contact最多只能执行三个串行任务,而contactArray可以执行多个,并且contactArray是可以直接传入数组的,这样就为一些动态的数量未知的任务提供了方便,下面我们来模拟串行执行下载任务(某些特殊需求,不能用并发,只能用串行):

       String[] filePaths = new String[]//文件下载地址
                "https://imtt.dd.qq.com/sjy.10001/16891/apk/9A8E683EEB620438BA39F1BCB6EF1262.apk",
                "https://imtt.dd.qq.com/sjy.10001/16891/apk/9A8E683EEB620438BA39F1BCB6EF1262.apk",
                "https://imtt.dd.qq.com/sjy.10001/16891/apk/9A8E683EEB620438BA39F1BCB6EF1262.apk",
        ;
        Observable[] tasks = new Observable[filePaths.length];
        for (int i = 0; i < filePaths.length; i++) 
            int finalI = i;
            tasks[i] = Observable.create(emitter -> 
                new DownLoadUtils().download(filePaths[finalI],
                        new File(File10Utils.getDownloadDirPath(mContext), File10Utils.md5("" + System.currentTimeMillis()) + ".apk"),
                        new DownLoadUtils.DownLoadListener() 
                            @Override
                            public void progress(DownLoadUtils.ProgressInfo progressInfo) 
                                LogUtil.e("正在下载第" + (finalI + 1) + "个文件:" + progressInfo.getProgress());
                            

                            @Override
                            public void OnSuccess() 
                                LogUtil.e("第" + (finalI + 1) + "个文件下载成功");
                                emitter.onNext(finalI + 1);
                                emitter.onComplete();
                            

                            @Override
                            public void OnFailure(String errorMsg) 
                                LogUtil.e("第" + (finalI + 1) + "个文件下载失败");
                                emitter.onNext(finalI + 1);
                                emitter.onComplete();
                            
                        );
            );
        

注意,这模拟了一个动态任务数,任务数量不定,每个下载任务都是异步的,而subscribe则在主线程,执行任务:

   Observable.concatArray(tasks)
                    .subscribeOn(AndroidSchedulers.mainThread())
                    .subscribe(index -> 
                        LogUtil.e("index>>" + index);
                    );

执行结果:

DownLoadUtils是自己封装的一个下载工具类,很简单,支持取消任务,支持下载进度,支持下载回调!下载

以上是关于RxJava串行执行任务的主要内容,如果未能解决你的问题,请参考以下文章

Quartz定时任务的并行与串行

背水一战 Windows 10 (118) - 后台任务: 后台下载任务(任务分组,并行或串行执行,组完成后通知)

spring定时器任务多任务串行执行问题排查

spring定时任务(scheduler)的串行并行执行

同步 ,异步,并发/并行,串行

如何以串行时间方式执行三个不同的任务?