RxJava学习笔记

RxJava学习笔记

RxJava三要素:

1.Observable被观察者,观察的对象,由它发出一系列的事件。可以通过create()方法创建,另外just()和from()方法同样可以实现。
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello");
                subscriber.onNext("World");
            }
        });

String[] name = {"Hello","World"};
Observable<String> observable1 = Observable.from(name);

Observable<String> observable2 = Observable.just("Hello","World");
2.Observer观察者,从被观察者Observable得到事件并决定产生怎样的行为。除了 Observer 接口之外,RxJava 还内置了一个实现了 Observer 的抽象类:
Subscriber。他们的基本使用方式是完全一样的,Observer 在 subscribe() 过程中最终也会被转换成 Subscriber 对象。
Subscriber<Drawable> subscriber = new Subscriber<Drawable>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Drawable drawable) {
                imageView.setImageDrawable(drawable);
            }
        };
3.Subscribe 订阅,Observable的事件发送是在被订阅的时候才开始执行,subscribe()方法执行时。
observable.subscribe(subscriber);

示例:

//将得到的drawable图像显示到ImageView
Observable<Drawable> observable = Observable.just(drawable);

Subscriber<Drawable> subscriber = new Subscriber<Drawable>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

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

observable.subscribe(subscriber);

RxJava变换

RxJava可以对事件序列中的对象或整个序列进行变换,转化为所需要的对象类型。

1.Map(),对事件对象的直接变换
//int类型的drawableRes通过map转变为drawable类型
Observable.just(drawableRes)
          .map(new Func1<Integer, Drawable>() {
                @Override
                public Drawable call(Integer integer) {
                    return mContext.getDrawable(integer);
                }
            })
          .subscribe(new Action1<Drawable>() {
                @Override
                public void call(Drawable drawable) {
                    imageView.setImageDrawable(drawable);
            }
        });
PS:FuncX也有多个,是带参数有返回值的,ActionX是带参数无返回值的。

2.flatMap()
    flatMap()将传进来的对象,返回一个生成的Observable对象,这个Observable再接收传进来的事件发送给Subscribe的回掉call方法,实现了
    两次的变换。
Student[] students = initView();
Observable.from(students)
          .flatMap(new Func1<Student, Observable<Course>>() {
                @Override
                public Observable<Course> call(Student student) {
                    return Observable.from(student.getCourses());
                    }
                })
          .subscribe(new Action1<Course>() {
                @Override
                public void call(Course course) {
                    Log.i("course",course.getCourse());
            }
        });
3.compose:对Observable的整体的变换
    lift()的变换是针对Observable中的事件序列的,compose()是对Obsrvable的整体进行的变换。
/**
*实现Transformer接口,Obervable通过Transformer传递进来的对象进行多次变换,实现自身的变换。
*/
public class TestCompose implements Observable.Transformer<String,Bitmap> {

    @Override
    public Observable<Bitmap> call(Observable<String> stringObservable) {
        return stringObservable.map(new Func1<String, InputStream>() {

            @Override
            public InputStream call(String s) {
                return HTTPRequest.Request(s);
            }
        }).map(new Func1<InputStream, Bitmap>() {
            @Override
            public Bitmap call(InputStream inputStream) {
                return BitmapFactory.decodeStream(inputStream);
            }
        });
    }
}


Observable.Transformer lift = new TestCompose();
Observable.just(url)
            .observeOn(Schedulers.newThread())
            .compose(lift)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Bitmap>() {
                @Override
                public void call(Bitmap bitmap) {
                    imageee.setImageBitmap(bitmap);
                }
            });

RxJava线程控制:Scheduler

线程控制器,可以指定每一部分代码运行的线程
 -  subscribeOn():指定subscribe() 所发生的线程,主要改变的是订阅的线程,即call()执行的线程,
 当有多个subscribeOn()同时存在时,只有第一个会产生作用。
 -  observeOn():指定Subscriber所运行在的线程,即onNext()执行的线程。
 可以通过observeOn()的多处设定不断改变运行的线程。

常用线程:

 - Schedulers.newThread():启用新的线程,并在新线程执行操作。
 - Schedulers.io():执行I/O操作所使用的线程。
 - AndroidSchedulers.mainThread():在Android的主线程执行操作。
Observable.just(url)
            //发起线程在新的线程
            .subscribeOn(Schedulers.newThread())
            .observeOn(Schedulers.newThread())
            .map(new Func1<String, Bitmap>() {
                @Override
                public Bitmap call(String s) {
                    return getBitMap(s);//新线程中执行
                }
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Bitmap>() {
                @Override
                public void call(Bitmap bitmap) {
                //主线程中执行
                    Imageget.setImageBitmap(bitmap);
                }
            });
本文错误之处,感谢指出!

本文参考:给 Android 开发者的 RxJava 详解(部分内容引用自该博客)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值