RxJava的入门和基本使用
来源:互联网 发布:手机淘宝怎么看评价 编辑:程序博客网 时间:2024/06/06 12:51
导包
在module的gradle中: compile "io.reactivex.rxjava2:rxjava:2.0.1" compile "io.reactivex.rxjava2:rxandroid:2.0.1"
基本概念
//使用Observable.create()方法构造一个被观察对象 Observable<Integer> objectObservable = Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { //e.onNext(T)发起事件 e.onNext(1); e.onNext(2); e.onNext(3); //结束事件 e.onComplete(); } }); //观察者对象,在被观察者发起事件时接收事件 Observer observer=new Observer<Integer>(){ //在订阅时调用 @Override public void onSubscribe(Disposable d) { Log.v("meee",getClass()+":\n"+"onSubscribe"); } //在接收事件时调用 @Override public void onNext(Integer value) { Log.v("meee",getClass()+":\n"+"onNext"+value); } //在出现错误时调用 @Override public void onError(Throwable e) { Log.v("meee",getClass()+":\n"+"onError"); } //在事件结束时调用 @Override public void onComplete() { Log.v("meee",getClass()+":\n"+"onComplete"); } }; //绑定观察者和被观察者 objectObservable.subscribe(observer);
运行结果:09-29 17:26:07.939 28098-28098/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$2: onSubscribe09-29 17:26:07.939 28098-28098/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$2: onNext109-29 17:26:07.939 28098-28098/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$2: onNext209-29 17:26:07.939 28098-28098/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$2: onNext309-29 17:26:07.939 28098-28098/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$2: onComplete
ObservableEmitter:事件的发起者,通过调用emitter的onNext(T value)、onComplete()和onError(Throwable error)就可以分别发出next事件、complete事件和error事件。1.可以发送无限个onNext, 观察者可以接收无限个onNext.2.发送了一个onComplete后, 事件将会继续发送, 但观察者收到onComplete事件之后将不再继续接收事件.3.发送了一个onError后, 事件将会继续发送, 但观察者收到onComplete事件之后将不再继续接收事件.4.可以不发送onComplete或onError.5.onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError, 也不能先发一个onComplete, 然后再发一个onError, 反之亦然6.发送多个onComplete,在接收到第一个onComplete后不再接收;但发送多个error会崩溃
切断联系
Disposable,废弃dispose()方法时, 观察者不能在接收事件,但被观察者会继续发送事件
Observable<Integer> objectObservable = Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { Log.v("meee",getClass()+":\n"+"emit1"); e.onNext(1); Log.v("meee",getClass()+":\n"+"emit2"); e.onNext(2); Log.v("meee",getClass()+":\n"+"emit3"); e.onNext(3); e.onComplete(); } }); Observer observer=new Observer<Integer>(){ //将Disposable 作为成员变量 Disposable mDisposable; @Override public void onSubscribe(Disposable d) { mDisposable=d; Log.v("meee",getClass()+":\n"+"onSubscribe"); } @Override public void onNext(Integer value) { if (value==2){ //切断观察者和被观察者间的联系 mDisposable.dispose(); } Log.v("meee",getClass()+":\n"+"onNext"+value); } @Override public void onError(Throwable e) { Log.v("meee",getClass()+":\n"+"onError"); } @Override public void onComplete() { Log.v("meee",getClass()+":\n"+"onComplete"); } }; objectObservable.subscribe(observer);
09-29 17:38:35.403 28319-28319/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$2: onSubscribe09-29 17:38:35.403 28319-28319/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$1: emit109-29 17:38:35.403 28319-28319/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$2: onNext109-29 17:38:35.403 28319-28319/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$1: emit209-29 17:38:35.403 28319-28319/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$2: onNext2//观察者无法再接收事件 09-29 17:38:35.403 28319-28319/com.junx.rxjava V/meee: class com.junx.rxjava.MainActivity$1: emit3
subscribe()方法
//绑定观察者和被观察者subscribe(observer);//事件没有人处理subscribe();//消费者:只关心onNext事件的观察者subscribe(consumer); objectObservable.subscribe(new Consumer<Integer>() { @Override public void accept(Integer integer) throws Exception { //发出的事件被尽数接收 Log.v("meee",getClass()+":\n"+"accept"+integer); } });
和Retrofit联合使用
retrofit入门:http://blog.csdn.net/skylakexun/article/details/78140480
public interface API { @FormUrlEncoded @POST("login") //返回Observable对象,LoginModel为接口返回的json的实例化class Observable<LoginModel> login2(@Field("username") String username, @Field("pwd") String pwd);}
//Retrofit private static Retrofit create() { OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); builder.readTimeout(10, TimeUnit.SECONDS); builder.connectTimeout(9, TimeUnit.SECONDS); return new Retrofit.Builder().baseUrl("url/") .client(builder.build()) .addConverterFactory(GsonConverterFactory.create()) //设置calladapter,将retrofit返回的Call对象转换为Observale对象 .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } Retrofit retrofit = create(); API api = retrofit.create(API.class); api.login2("123","123456") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<LoginModel>() { @Override public void onSubscribe(Disposable d) { //获取mDisposable对象,用于防止act退出后rxjava的进程没有结束而导致的崩溃 mDisposable=d; } @Override public void onNext(LoginModel value) { //进行相关的操作 } @Override public void onError(Throwable e) { } @Override public void onComplete() { } });
读取数据库
public Observable<List<Record>> readAllRecords() { return Observable.create(new ObservableOnSubscribe<List<Record>>() { @Override public void subscribe(ObservableEmitter<List<Record>> emitter) throws Exception { Cursor cursor = null; try { cursor = getReadableDatabase().rawQuery("select * from " + TABLE_NAME, new String[]{}); List<Record> result = new ArrayList<>(); while (cursor.moveToNext()) { result.add(Db.Record.read(cursor)); } emitter.onNext(result); emitter.onComplete(); } finally { if (cursor != null) { cursor.close(); } } } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); }
阅读全文
0 0
- RxJava的入门和基本使用
- RxJava(RxAndroid)基本使用入门
- RxJava(RxAndroid)基本使用入门
- RxJava(RxAndroid)基本使用入门
- RxJava(RxAndroid)基本使用入门
- RXJAVA的入门和使用总结
- RxJava的基本使用
- RxJava的基本使用
- RxJava的基本使用
- RxJava的基本使用
- RxJava 的使用入门
- RxJava 的使用入门
- RxJava 的使用入门
- RxJava 2.0的基本使用
- [Android]RxJava的简单介绍和基本使用(一)
- RxJava的简单使用入门
- RxJava的入门和精通
- Rxjava Rxandroid基本入门
- 超实用PHP函数总结整理(一)
- ubuntu16.04如何安装搜狗输入法及共享文件夹
- Unity HTC修改场景切换的过渡场景
- Python——验证码识别 安装Pillow、tesseract-ocr与pytesseract模块的安装以及错误解决
- Dapper的使用
- RxJava的入门和基本使用
- 什么是闭包?
- eclipse中.svg文件报错
- hive分区表增加字段会导致新增字段无法显示值的BUG
- java环境配置
- PHP中magic_quotes_gpc和 magic_quotes_runtime区别
- UOJ 261/bzoj 4719(LCA)(NOIP2016)(天天爱跑步)
- antlr-2.7.6.jar 包问题
- 视频监控安防平台-国标28181 2016-GB28181 2016版检测经历 (平台上联和下联检测)