学习RxJava之路

RXJAVA学习之路

        --路漫漫其修远兮,吾将上下而求索--屈原

1.引入依赖

github链接:

https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid 

引入依赖:

compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'

RxJava到底是什么

异步:一个实现异步操作的库。

RxJava 好在哪

代码简洁.

API 介绍和原理简析

扩展的观察者模式

RxJava的观察者模式

四个基本概念:Observable(可观察者,既被观察者),Observable(观察者),subscribe(订阅),事件。

RxJava的回调方法,除了普通事件onNext()(相当于onClick/onEvent)之外,还定义了两个特殊的事件:onCompleted()和onError().

  • onCompleted():事件队列完结,RxJava不仅把每个事件单独处理,还会把他们看成一个队列。规定:当不会再有新的onNext()发出时,需要触发onCompleted()方法做标志。
  • onError()事件队列异常,onError()会被触发,同时队列终止,不允许再有事件发出。
  • 在一个正常运行的事件队列中,两个只能存在一个,若调用了其中一个,就不能调用另一个。

基本实现

  • 创建Observer

    Observer<String> observer = new Observer<String>() {
        @Override
        public void onCompleted() {
    
        }
    
        @Override
        public void onError(Throwable e) {
    
        }
    
        @Override
        public void onNext(String s) {
    
        }
    };
    

    除了Observer接口之外,RxJava还内置了一个实现Observer的抽象类:Subscriber。使用方式与Observe基本一致,区别有两点:

    • onstart() 会再subscribe刚开始,事件未发送前被调用,例如数据的清零或重置,但是若准备 工作对线程有要求,(例如弹出一个对话框,需要在主线程完成,)onstart()就不适用了,要在指定的线程中做准备工作可以用doOnSubcribe();

    • unsubcribe() 用于取消订阅,因为在subcribe之后,Observable会持有subcribe的引用,需要及时释放,不然会造成内存泄漏,(在onpause(),onstop())调用此方法,接触引用关系。

    • 创建Observable:被观察者

      Observable observable = Observable.create(new Observable.OnSubscribe() {
      @Override
      public void call(Subscriber

线程控制–Scheduler(一)

在不指定线程的情况下,RxJava遵循线程不变的原则,即在那个线程调用subcribe,就在那个线程生产事件,就在那个线程消费事件,,若需要切换线程,就需要用到Scheduler(调度器)

  • Scheduler的API(一)

    RxJava通过调度器来控制那段代码在什么线程中运行,RxJava内置了几个scheduler。

1.schedulers.immediate():直接在当前线程运行,相当于不指定线程。这是默认的scheduler

2.schedulers.newThread():总是启用新线程,并在新线程中操作。

3.schedulers.io();I/O操作(读写文件,读写数据库,网络信息交互)所使用的schedulers。与newThread的区别是在于io()内部实现了一个无数量上限的线程池,可以重用空闲的线程,尽量不要把计算工作放在,io()中,可以避免创建不必要的线程。

4.Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。

有scheduler,就可以使用subcribeOn()和observeOn两个方法对线程控制,subcribeOn():制定subcribe()所发生的线程,即observable.OnSubcribe被激活时所处的线程,或者叫事件的生产线程, * observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
修改上面的列子:

      final int drawableRes = R.mipmap.h;
    final ImageView imageView = (ImageView) findViewById(R.id.imageView);
    Observable.create(new Observable.OnSubscribe<Drawable>() {
        @Override
        public void call(Subscriber<? super Drawable> subscriber) {
            Drawable drawable = getTheme().getDrawable(drawableRes);
            subscriber.onNext(drawable);
            subscriber.onCompleted();
        }
    })
            .subscribeOn(Schedulers.io())//指定subcribe()发生在io线程
            .observeOn(AndroidSchedulers.mainThread())//回调发生在主线程
            .subscribe(new Observer<Drawable>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Drawable drawable) {
            imageView.setImageDrawable(drawable);
        }
    });

变换

RxJava提供了对事件序列进行变换的支持,所谓变换就是将事件序列中的对象或者整个序列进行加工,转换成不同的事件,或事件序列。

  • API

    Observable.just("images/logo.png") // 输入类型 String
    .map(new Func1<String, Bitmap>() {
    @Override
    public Bitmap call(String filePath) { // 参数类型 String
        return getBitmapFromPath(filePath); // 返回类型 Bitmap
    }
     })
    .subscribe(new Action1<Bitmap>() {
    @Override
    public void call(Bitmap bitmap) { // 参数类型 Bitmap
        showBitmap(bitmap);
    }
    });
    

    func1与Action1相似,区别在于func1包装了一个有返回值的方法,map()方法将String对象转化成了一个Bitmap对象,事件类型也有String转换成了一个Bitmap对象。

    • map();事件对象的直接转化
    • flatmap();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值