RxAndroid 学习笔记

版权声明:转载请注明出处。作者:两仪织,博客地址:http://blog.csdn.net/u013894427 https://blog.csdn.net/u013894427/article/details/86006934

这篇博客是学习RxAndroid过程中做的笔记,学习的博客为

优美的异步

nicolelili1的Rx相关文章

概念

  • FuncX X表示参数个数
  • emit 发射
  • retrofit 改造
  • <? extends T>表示上界通配符,表示T和它的子类
  • <? super T>表示下界通配符,表示T和它的父类

响应式编程

A=B+C A经过赋值之后,如果B的值改变了,A的值会随之改变

基本的过程

  • 创建被观察者(Observable)
  • 创建观察者(Observer)
  • 被观察者.subscribe(观察者)完成两者连接
  • 被观察者用onNext给观察者传递结果
  • 被观察者中调用onComplete之后,观察者和被观察者断开连接
  • 被观察者调用onNext()函数的参数如果是error,观察者调用onError函数,被观察者和观察者断开连接(但是观察者依然会发送????所以不能调用多个onError())
  • 观察者可以通过调用onSubscribe()中传入的对象Disposable的dispose()函数即可完成断开连接,关联断开后,被观察者依然会继续发送数据

高级用法

  • Observable.just就是用来创建只发出一个事件就结束的Observable对象
  • Observable.create()
  • 用Action代替Observer的onComplete()
  • 用Consumer代替Observer的onNext()函数
  • 用Consumer代替Observer的onError()
  • 用Consumer代替Observer的onSubscribe(),
  • 所以被观察者的subscribe()就会有多个重载的方法
    举例
Observable<String> observable = Observable.just("hello");
Action onCompleteAction = new Action() {
    @Override
    public void run() throws Exception {
        Log.i("kaelpu", "complete");
    }
};
Consumer<String> onNextConsumer = new Consumer<String>() {
    @Override
    public void accept(String s) throws Exception {
        Log.i("kaelpu", s);
    }
};
Consumer<Throwable> onErrorConsumer = new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        Log.i("kaelpu", "error");
    }
};
observable.subscribe(onNextConsumer, onErrorConsumer, onCompleteAction);

线程调度

  • 观察者和被观察者都是工作在同一个线程中的
  • 被观察者在调用subscribe()函数之前可以调用subscribeOn()来指定被观察者运行的线程,多次调用只有第一次调用有效果
  • 被观察者在调用subscribe()函数之前可以调用observeOn()来指定观察者运行的线程,调用依次可以切换一次运行线程
  • Schedulers.newThread()是RxAndroid中设计的新线程
  • Schedulers.io()是RxAndroid提供的IO线程池中的一个
  • Schedulers.immediate(): 默认指定的线程,也就是当前线程;
  • Schedulers.computation():计算所使用的调度器。这个计算指的是 CPU 密集型计算,即不会被 I/O等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。值得注意的是,不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU
  • AndroidSchedulers.mainThread()表示的是UI主线程
  • create(),just(),from() — 事件产生 运行在被观察者线程中
  • map(),flapMap(),scan(),filter()等-- 事件加工 运行在观察者线程中
  • subscribe()-- 事件消费运行在观察者线程中

举例


Observable.just(getDrawableFromNet("http://www.baidu.com/icon.png"))
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<Drawable>() {
            @Override
            public void accept(Drawable drawable) throws Exception {
                ((ImageView)findViewById(R.id.imageView)).setImageDrawable(drawable);
            }
        });
private Drawable getDrawableFromUrl(String url){
    try {
        Thread.sleep(6000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return getResources().getDrawable(R.drawable.baidu);
}

操作符的使用

  • 大部分操作符都是静态函数,直接可以通过Observable来调用
  • create(new ObservableOnSubscribe)作用是新建一个被观察者实例
  • merge(observable1,observable2)作用是多个被观察者序列合成一个序列,方便观察者管理
  • from()在RxAndroid2.x中被分解成了三个函数
    • fromArray(),fromIterable(),fromFuture()
    • 接收一个集合作为输入,然后每次输出一个元素给subscriber
  • map(Function<From from,To to>)作用是把原始发送的数据进行一定的转换,传入的Function类,返回值的类型就是To
  • flatmap(From from,To to)作用是把被观察者中传递的单个对象,拆分成多个创建新的被观察者,然后单独发送给观察者,返回值当然是Observable类型的,但是里面传递的call函数的返回值可以不是呀
  • zip(Observable1,Observable2,new BiFunction)
    • 是Observable类的静态函数
    • 只会运行项目最少(onNext()函数调用最少)的那个被观察者的onNext()函数,其他函数不受影响
  • filter()条件过滤,去除某些不符合条件的事件
  • take()最多保留的事件数
  • range(int start,int num )仅仅用于Integer之类的,start表示起始值,num表示要发送的事件的个数,如果是0,则不会发送,如果是负数,则会报错
  • interval()传入一个表示时间间隔的参数和一个表示时间单位的参数。onNext()接收到的参数会是从0开始到无限大的数据,这样的话,占位符T就表示long。作用感觉和repeatWhen类似
  • doOnNext(Consumer)在执行下一个事件之前需要做的事情
  • repeat() 不是静态的,需要具体的实例来调用,是在触发到onComplete之后才调用的
    • 如果不传入参数,那么会一直发射
    • 如果传入参数为数字,那么会重复有限次数
  • repeatWhen(new Func1()) 表示有条件的重复发送事件,比如定时发送
  • retry() 不是静态的,需要具体的实例来调用,是在触发到onError之后调用的

针对Android的扩展

  1. AndroidSchedulers.mainThread():表示Android的主线程
  2. AndroidObservable提供了很多方法来配合Android 的生命周期
    • bindActivity()和bindFragment()默认使用主线程执行观察者的代码
    • fromBroadcast()创建一个类似BroadcastReceiver的被观察者对象
  3. ViewObservable可以给View添加一些绑定
    • clicks()每次点击view的时候都可以收到一个事件
    • text() 监听textview内容的变化

RxAndroid的一些应用场景

  • 界面需要等到多个并发接口取完数据再更新,
  • 界面按钮需要防止连续点击
  • 响应式页面,比如勾选了某一个checkbox,自动更新Preference

猜你喜欢

转载自blog.csdn.net/u013894427/article/details/86006934