1.在初始化的时候 需要将
URL集合 中每个string转化为Observable 来实现 并行下载 且不需要前后顺序 只需要加载完成
因此使用 flatMap
2.选用的Scheduler 选用了常用的Schedulers.io() 在并行操作的情况下 为其自动分配线程执行任务
以下这些都是操作线程的方法,我们都知道RxJava在异步方面很优秀,那我们应该怎么去体现他尼,先来看下这几个函数的具体含义吧
Schedulers.immediate()
作用于当前线程运行,相当于你在哪个线程执行代码就在哪个线程运行
Schedulers.newthread();
运行在新线程中,相当于new Thread(),每次执行都会在新线程中
Schedulers.io();
一看便知,I/O操作,比如文件操作,网络操作等,他和newThread有点类似,不过I/O里面有一个死循环的线程池来达到最大限度的处理逻辑,虽然效率高,但是如果只是一般的计算操作,不建议放在这里,避免重复创建无用线程
Schedulers.computation()
一些需要CPU计算的操作,比如图形,视频等
AndroidSchedulers.mainThread();
指定运行在Android主线程中
3.具体demo
public void loadFromUrlList(List<String> list, Context context) { if (CollectionUtils.isEmpty(list)) { return; } Observable.from(list).flatMap(new Func1<String, Observable<String>>() { @Override public Observable<String> call(String s) { Log.d(TAG, "Observable call: String: " + s + " name: " + Thread.currentThread().getName()); return Observable.just(s) .subscribeOn(Schedulers.io()) .map(new Func1<String, String>() { @Override public String call(String s) { Log.d(TAG, " doOnNext call: String: " + s + " name: " + Thread.currentThread().getName()); LottieCompositionFactory.fromUrl(context, s); return s; } }); } }).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()).subscribe(new Action1<String>() { @Override public void call(String s) { Log.d(TAG, " subscribe call: String: " + s + " name: " + Thread.currentThread().getName()); } }); }