简介
https://www.imooc.com/article/68834
https://www.jianshu.com/p/ceead80495d0
我们一般写的程序 统称为命令式程序,是以流程为核心的,每一行代码实际上都是机器实际上要执行的指令,而RxJava是一个以函数响应式编程为结构,以观察者模式思想为核心,在Java VM上使用可观测序列来组成的一个异步的,基于事件的库,它不管应用的业务逻辑如何复杂始终都能保持代码的结构简洁,逻辑清晰,因此广受开发者的青睐。
RxJava在响应式编程中的基本流程可以概括为:
1,定义事件源来发送具体的事件,这里的事件可以是任何东西,例如网络请求、复杂计算处理、数据库操作、文件操作等等。
2,(可选Operator)借助RxJava强大的操作符将发送的事件或事件序列,加工后转换成不同的事件或事件序列。
3,定义事件的接受者,用于处理相应的事件
4,事件的发出者和接收者达成订阅关系
若事件从产生到消费不需要其他处理,则可以省略掉中间的 Operator.
相似名词解释
Observable:被观察者,所有事件的发射源
Observer:观察者,事件的接收和处理者
subscribe:订阅方法方法名,负责将观察者和被观察者关联起来
Subscriber:订阅者,也是事件的接收和处理者,那它跟Observer有什么区别呢?如下:
public abstract class Subscriber<T> implements Observer<T>, Subscription
Subscriber实现了Observer接口,比Observer多了2个方法 onStart() 和 unsubscribe( ),实质上,在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用,所以一般情况下,建议使用Subscriber作为接收源;两个方法的解释如下:
1,onStart(): 这是 Subscriber 增加的方法。它会在 subscribe刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行),onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用doOnSubscribe() 方法。
2,unsubscribe(): 这是 Subscriber所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 unsubscribe()这个方法很重要,因为在 subscribe() 之后, Observable 会持有 Subscriber的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用 unsubscribe() 来解除引用关系,以避免内存泄露的发生。
Subscription :Observable调用subscribe( )方法返回的对象,同样有unsubscribe( )方法,可以用来取消订阅事件;
Action0:RxJava中的一个接口,它只有一个无参call()方法,且无返回值,同样还有Action1,Action2…Action9等,Action1封装了含有 1 个参的call()方法,即call(T t),Action2封装了含有 2 个参数的call方法,即call(T1 t1,T2 t2),以此类推;
Func0:与Action0非常相似,也有call()方法,但是它是有返回值的,同样也有Func0、Func1…Func9;
基本用法
Observable被观察者的创建
使用create( ),最基本的创建方式:
Observable<String> myObservable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello, world!"); //发射一个"Hello, world!"的String
subscriber.onCompleted();//发射完成,这种方法需要手动调用onCompleted,才会回调Observer的onCompleted方法
}});
Retrofit单独使用示例
1,首先添加依赖和权限
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
<uses-permission android:name="android.permission.INTERNET" />
2,根据接口url返回的数据定义对应的实体类
例如接口 http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello world 对应的json格式的数据如下:
定义的实体类Translation.java如下:
public class Translation {
private int status;
private content content;
private static class content {
private String from;
private String to;
private String vendor;
private String out;
private int errNo;
}
//定义 输出返回数据 的方法
public void show() {
System.out.println(status);
System.out.println(content.from);
System.out.println(content.to);
System.out.println(content.vendor);
System.out.println(content.out);
System.out.println(content.errNo);
}
}
3,创建用于描述网络请求的接口
public interface GetRequest_Interface {
@GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
Call< Translation > getCall();
}
4,创建retrofit对象
5,获取call实例
6,发送网络请求,处理返回的数据
public void request() {
//步骤4:创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url
.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
.build();
// 步骤5:获取Call实例
Call<Translation> call = retrofit.create(GetRequest_Interface.class).getCall();
//步骤6:发送网络请求(异步)
call.enqueue(new Callback<Translation>() {
//请求成功时回调
@Override
public void onResponse(Call<Translation> call, Response<Translation> response) {
// 步骤7:处理返回的数据结果
response.body().show();
}
//请求失败时回调
@Override
public void onFailure(Call<Translation> call, Throwable throwable) {
System.out.println("连接失败");
}
});
}
retrofit + rxjava
1.因为要结合使用RxJava,所以返回值就不在是一个Call了,而是一个Observable:
public interface GetRequest_Interface {
@GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
Observable< Translation > getCall();
}
2,创建retrofit实例时,配置关联rxJava2:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url
.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
3,步骤5返回的不再是call实例,而是RxJava里面的被观察者Observable实例:
Observable<Translation> observable= retrofit.create(GetRequest_Interface.class).getCall();
4,获取到了Observable的实例,接下来就是rxJava的语法了,如下:
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Translation>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Translation translation) {
// 成功获取到gson转换后的对象translation
}
@Override
public void onError(Throwable e) {
Log.v("zyl", "请求失败:"+e.getMessage());
}
@Override
public void onComplete() {
}
});