RxJava讲解

简介

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() {

            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智玲君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值