0
点赞
收藏
分享

微信扫一扫

lottie多线程下载缓存

alonwang 2022-01-13 阅读 75

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());
            }
        });
}
举报

相关推荐

0 条评论