RxJava2的使用

May you return with a young heart after years of fighting.
愿你出走半生,归来仍是少年。​​​

1.RxJava2简介

什么是Rxjava2?

Rxjava是一个异步框架,功能和handler类似,采用链式调用。基于观察者模式,有三个重要角色:被观察者(Observable)、订阅(subscribe)、观察者(Observer)。
核心思想:被观察者和观察者通过订阅产生一种关系(observable.subscribe(observer)),当observable发生改变,通知observer,observer对应做出相应的回应。
比如:电视节目是被观察者,观众是观察者,电视节目和观众通过subscribe产生订阅关系,电视节目更新了,通知观众去观看新节目。

2.角色创建

2.1 创建被观察者

Observable<String> tv= Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                for (int i=1;i<4;i++){
                    Log.i("Rxjava","庆余年,我更新了第"+i+"集");
                    emitter.onNext(i);//发射数据
                }
            }
        })

调Observable的create()方法传入ObservableOnSubscribe对象,并重写subscribe()方法,在subscribe()中有一个ObservableEmitter发射器,对象调用发射器的onNext(),把被观察者(Observable)的事件发送出去。

2.2创建观察者

Observer<String> audi= new Observer<Integer>() {
			
			//当Observer和Observable订阅的时候调用
            @Override
            public void onSubscribe(Disposable d) {
                Log.d("Rxjava","我是观众,我和新剧订阅了");
            }
			
			//对Observable中的emitter.onNext()发射出来的事件i进行处理
            @Override
            public void onNext(Integer i) {
                Log.d("Rxjava","我是观众,我看了新剧第"+i+"集");
            }

			//出现错误
            @Override
            public void onError(Throwable e) {
				e.printStackTrace();
            }
			
			//Observable发送来的事件全部处理完成的时候调用
            @Override
            public void onComplete() {
                Log.d("Rxjava","我是观众,我把更新新剧看完了。");
            }
        };

注意:onError()和onComplete()互斥,只会调用一个。

2.3 订阅关系

 tv.observeOn(AndroidSchedulers.mainThread());//在主线程观察事件
	.subscribeOn(Schedulers.newThread());//在子线程订阅
    .subscribe(audi);//形成订阅关系

2.4 链式调用

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                for (int i=1;i<4;i++){
                    Log.i("Rxjava","庆余年,我更新了第"+i+"集");
                    emitter.onNext(i);//发射数据
                }
            }
        })
    .observeOn(AndroidSchedulers.mainThread());//在主线程观察事件
	.subscribeOn(Schedulers.newThread());//在子线程订阅
    .subscribe(new Observer<Integer>() {//形成订阅关系
			
			//当Observer和Observable订阅的时候调用
            @Override
            public void onSubscribe(Disposable d) {
                Log.d("Rxjava","我是观众,我和新剧订阅了");
            }
			
			//对Observable中的emitter.onNext()发射出来的事件i进行处理
            @Override
            public void onNext(Integer i) {
                Log.d("Rxjava","我是观众,我看了新剧第"+i+"集");
            }

			//出现错误
            @Override
            public void onError(Throwable e) {
				e.printStackTrace();
            }
			
			//Observable发送来的事件全部处理完成的时候调用
            @Override
            public void onComplete() {
                Log.d("Rxjava","我是观众,我把更新新剧看完了。");
            }
        });

3.Rxjava在Android中使用(Retrofit + Rxjava)

3.1添加依赖与网络权限

    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
 <uses-permission android:name="android.permission.INTERNET"/>

3.2创建接口

public interface BaiduService {

    @GET(".")
    Observable<String> getBaidu();
}

3.2 Retrofit + Rxjava调用

创建Observable的过程

//创建Retrofit 
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://www.baidu.com")//请求URL
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .build();
//创建接口引用
BaiduService baiduService = retrofit.create(BaiduService.class);
//调用接口的方法,得到Observable
Observable<String> baidu = baiduService.getBaidu();

由于Observer的四个方法没必要全部调用,先对Observer代码优化

public abstract class BaseObserver<T> implements Observer<T> {

    public abstract void onSuccess(T t);
    public abstract void onFail(Throwable e);
    
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(T t) {
        onSuccess(t);
    }

    @Override
    public void onError(Throwable e) {
        onFail(e);
    }

    @Override
    public void onComplete() {

    }
}

订阅方法1

baidu.subscribeOn(Schedulers.newThread())//子线程订阅访问网络
                .observeOn(AndroidSchedulers.mainThread())//主线程观察
                .subscribe(new BaseObserver<String>() {//产生订阅关系
					//请求成功
                   @Override
                    public void onSuccess(String s) {
                        Log.v("Rxjava",s);
                    }
					//请求异常
                    @Override
                    public void onFail(Throwable e) {
                        Log.v("Rxjava",e.getMessage());
                    }

                });

订阅方法2

CompositeDisposable cd = new CompositeDisposable();
cd.add(baidu
         .subscribeOn(Schedulers.newThread())
         .observeOn(AndroidSchedulers.mainThread())
         //带一个Consumer参数的方法表示下游只关心onNext事件, 其他的事件不关心,就可以这么写
         .subscribe(new Consumer<String>() {
             @Override
             public void accept(String s) throws Exception {
 				Log.v("Rxjava",s);
             }
         }));
 //解除订阅关系
 cd.dispose();

4.RxJava2常用操作符

4.1操作符——create(参考前面的用法)
4.2操作符——just

just作用就是一旦订阅,立马发出消息

Observable.just("Rxjava").subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);//Rxjava
            }
        })
4.2操作符——from

对数组或者列表的发送

	List<Integer> list = new ArrayList<>();
	for (int i = 0; i < 20; i++) {
	    list.add(i);
	}
	//fromArray接收列表或者数组
	Observable.fromArray(list).subscribe(new Consumer<List<Integer>>() {
	            @Override
	            public void accept(List<Integer> integers) throws Exception {
					for (Integer i:list) {
                    	Log.e("Rxjava",i+"");
                	}
	            }
	        })
4.2操作符——map与flatMap

map对传输数据转型,Integer转String

Observable.range(10, 5)//10,11,12,14,15
                .map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer)  {
                        return String.format("Integer %s 变String %s", integer, integer);
                    }
                }).subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s)  {
                        System.out.println(s);
                    }
                })
 ——————————————————————————————输出结果————————————————————————————————————————————————————            
	Integer 10 变String 10
	Integer 11 变String 11
	Integer 12 变String 12
	Integer 13 变String 13
	Integer 14 变String 14                         

flatMap将一个发送事件的上游Observable变换为多个发送事件的Observables,然后将它们发射的事件合并后放进一个单独的Observable里. flatMap并不保证事件的顺序,如果要保证事件的顺序,使用concatMap。

Observable.just(1, 2, 3).flatMap(new Function<Integer, Observable<String>>() {
            @Override
            public Observable<String> apply(Integer integer) throws Exception {
                final List<String> list = new ArrayList<>();
                for (int i = 0; i < 3; i++) {
                    list.add("Integet =  " + integer + ", i = " + i);
                }
                //注意:这里返回到下游的是Observable,list长度为3,每次返回3个到下游
                return Observable.fromIterable(list);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) {
                  System.out.println(s);
            }
        });
——————————————————————————————输出结果————————————————————————————————————————————————————   
Integer = 1, i = 0
Integer = 1, i = 1
Integer = 1, i = 2
Integer = 2, i = 0
Integer = 2, i = 1
Integer = 2, i = 2
Integer = 3, i = 0
Integer = 3, i = 1
Integer = 3, i = 2                 
发布了28 篇原创文章 · 获赞 1 · 访问量 503

猜你喜欢

转载自blog.csdn.net/qq_40575302/article/details/104768974