Rxjava(2.Schedulers调度器)

1、Schedulers调度器

Schedulers将用简单的方式创建多线程。对于android移动端来说,做耗时操作只能在子线程中,返回结果后刷新UI又得切换到主线程中。很多时候我们需要new Thread(),然后用Handler进行请求后的回调,或者借助Asynctask类。这样代码在一个类中这样写可能不多,但对于android来说,每个界面几乎都要请求网络,刷新UI。因此这样的工作一来增加的代码量,不容易维护。二来面对复杂的业务需求的时候,不容易修改和实现。

Scheduler为rxjava添加多线程调度的功能,可以指定操作符在某个调度器(Scheduler)上运行。

Rxjava提供了5种调度器:

  1. io()
  2. computation()
  3. immediate()
  4. newThread()
  5. trampoline()

这里写图片描述

1、Schedulers.i0()

主要用于一些耗时操作,比如读写文件,数据库存取,网络交互等。
这个调度器根据需要,增加或者减少线程池中的线程数量。需要注意的是Schedulers.i0()中的线程池数量是无限制大的,大量的I/0操作将创建许多线程,我们需要在性能和线程数量中做出取舍。

2、Schedulers.computation()

计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。

3、Schedulers.immediate()

默认的,直接在当前线程运行。

4、Schedulers.newThread()

开启一个新的线程

5、Schedulers.trampoline()

当我们想在当前线程执行一个任务时,并不是立即执行,用trampoline()将它加入队列。这个调度器将会处理它的队列并且按程序运行队列中每一个任务。

6、AndroidSchedulers.mainThread()

Android中专用的,指定的操作在Android的主线程(UI线程中)运行。

2、SubscribeOn和ObserverOn

SubscribeOn

指定Observable自身在哪个调度器上执行,可以使用SubscribeOn操作符指定Observable在一个特定的调度器上运行。

ObserveOn

指定Observable应该在哪个调度器上调用观察者的onNext, onCompleted, onError方法,你需要使用ObserveOn

也就是说:
subscribeOn()主要改变的是订阅的线程,即call()执行的线程;
observeOn()主要改变的是发送的线程,即onNext, onCompleted, onError执行的线程。

仍物线总结:

1、只有第一subscribeOn() 起作用(所以多个 subscribeOn() 毛意义)
2、 subscribeOn() 控制从流程开始的第一个操作,直到遇到第一个 observeOn()
3、observeOn() 可以使用多次,每个 observeOn() 将导致一次线程切换(),这次切换开始于这次 observeOn() 的下一个操作
4、不论是 subscribeOn() 还是 observeOn(),每次线程切换如果不受到下一个 observeOn() 的干预,线程将不再改变,不会自动切换到其他线程

3、示例

示例1

Observable
.map                    // 操作1
.flatMap                // 操作2
.subscribeOn(io)
.map                    //操作3
.flatMap                //操作4
.observeOn(main)
.map                    //操作5
.flatMap                //操作6
.subscribeOn(io)        //!!特别注意
.subscribe(handleData)

操作1,操作2是在io线程上,因为之后subscribeOn切换了线程
操作3,操作4也是在io线程上,因为在subscribeOn切换了线程之后,并没有发生改变。
操作5,操作6是在main线程上,因为在他们之前的observeOn切换了线程。
特别注意那一段,对于操作5和操作6是无效的

示例2

下面一个网络请求,请求在io线程中,请求后返回数据后的回调在主线程中,可以刷新UI。

  subscription = com.example.rxjava.Network.getNewFunApi().getNewTop("1", "10")
                .subscribeOn(Schedulers.io())//指定subscriber在I/0线程中执行
                .observeOn(AndroidSchedulers.mainThread())//在主线程中执行
                .subscribe(new Observer<NewTop>() {
                    @Override
                    public void onCompleted() {
                        //swiperefresh.setRefreshing(false);
                        Log.i("--rxjava--", "onCompleted");

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i("--rxjava--e", e.toString());

                    }

                    @Override
                    public void onNext(NewTop d) {
                        Log.i("--date", d.getData().toString());
                    }
                });
    }
package com.qish.tenmentapp.net.response; import com.qish.tenmentapp.net.exception.ApiException; import com.qish.tenmentapp.util.ReflectUtils; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.ObservableSource; import io.reactivex.rxjava3.core.ObservableTransformer; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.functions.Consumer; import io.reactivex.rxjava3.functions.Function; import io.reactivex.rxjava3.schedulers.Schedulers; public class ResponseTransformer<T> implements ObservableTransformer<IResponse<T>, T> { private CompositeDisposable compositeDisposable; public ResponseTransformer(CompositeDisposable compositeDisposable) { this.compositeDisposable = compositeDisposable;} public ResponseTransformer() {} @Override public ObservableSource<T> apply(Observable<IResponse<T>> upstream) { return upstream.doOnSubscribe(new Consumer<Disposable>() { @Override public void accept(Disposable disposable) throws Exception { if (compositeDisposable != null) { compositeDisposable.add(disposable); } } }).onErrorResumeNext(new Function<Throwable, ObservableSource<? extends IResponse<T>>>() { @Override public ObservableSource<? extends IResponse<T>> apply(Throwable throwable) throws Exception { return Observable.error(ApiException.handleException(throwable)); } }) .flatMap(new Function<IResponse<T>, ObservableSource<T>>() { @Override public ObservableSource<T> apply(IResponse<T> response) throws Exception { if (response.isSuccess()) { if (response.getData() != null) { return Observable.just(response.getData()); } else { try { Class<?> clz = ReflectUtils.analysisClassInfo(response); T obj = (T) clz.newInstance(); return Observable.just(obj); } catch (Exception e) { e.printStackTrace(); } } } return Observable.error(new ApiException(response.getCode(),response.getMessage())); } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public static <U> ResponseTransformer<U> obtain(CompositeDisposable compositeDisposable) { return new ResponseTransformer<>(compositeDisposable); } public static <U> ResponseTransformer<U> obtain() { return new ResponseTransformer<>(); } } 优化代码
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值