首页 > 编程语言 > 详细

RxJava的简单学习(学习自扔物线)

时间:2015-12-03 14:12:54      阅读:436      评论:0      收藏:0      [点我收藏+]

首先说明下面这个是看扔物线大大的学习笔记,请直接前往 这里看极其详细的入门版这里先给出这个歌开源库的github地址

前言

当前RxJava可是越来越火,也越来越多的人开始学习RxJava,越来越多的项目开始使用RxJava,那么我们就有必要来学习下RxJava。

RxJava是什么

Rx是什么

RX(Reactive Extensions)原来是由微软提出的一个综合了异步和机遇事件驱动的库包,使用开观察序列和LINQ-style查询操作。那么RX有什么特点呢?Rx最显著的特性是使用可观察集合(Observable Collection)来达到集成异步(composing asynchronous)和基于事件(event-based)的编程的效果。当然,RX当中的序列为数据流。这些我们不多说了。RX介绍

RxJava是什么

RxJava是由ReactiveX开发并维护的一个开源项目。先来看看ReactiveX的介绍。
技术分享
很明显异步编程,接下来我们在看看RxJava的介绍。
技术分享
一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。有点抽象,这句话说白了就是观察者模式、异步、事件流。RxJava是一种响应式编程。响应式编程

  • 观察者模式,举个例子?比如说你睡午觉了,舍友不睡,你就说某某,到了几点叫我,然后时间一到,他叫你起床了,这就是个很简单的例子。关于观察者模式,就不细说了。
  • 异步 什么?你不知道异步是什么?那你怎么学编程的。异步就是不用等待结果,即可继续执行,这里就又牵出一个回调的概念,不多少了、
  • 事件流 就是一系列有序事件

RxJava怎么用

现在AS中引入。

compile ‘io.reactivex:rxjava:1.0.16‘
compile ‘io.reactivex:rxandroid:1.0.1‘

这里引入RxAndroid的原因是 这里是android程序。

1.Observer观察者

有下面2中方式。

public static Observer getObserver(){
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted: " );
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: "+e.getMessage() );
            }

            @Override
            public void onNext(String s) {
                Log.e(TAG, "onNext: "+s );
            }
        };

        return observer;
    }
public static Observer getSubscriber(){
        Subscriber<String> subscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted: " );
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: " );
            }

            @Override
            public void onNext(String s) {
                Log.e(TAG, "onNext: "+s );
            }
        };

        return subscriber;
    }

2者的关系如下
技术分享

  • onCompleted 事件流结束
  • onError 出错
  • onNext 事件正常
    这三个就是事件发生时触发的回调。在android中,回调一般发生在UI线程。

2.Observable被观察者

Observable的源码1w+行,我们一般通过下面三种方式来创建被观察者。

2.1.Create

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super  String> subscriber) {
                subscriber.onNext("hello");
                subscriber.onNext("world");
                subscriber.onNext("my name is quanshijie");
                subscriber.onCompleted();
            }
        });

其中的onNext就是一个一个的事件。这种方式必须以onCompleted结束。

2.2.just

Observable observable = Observable.just("hello", "world", "my name is quanshijie");

just中就是一个一个的事件

2.3.form

String[] words = {"hello","world","my name is quanshijie"};
Observable observable = Observable.from(words);

3.Subscribe 订阅

Observable.subscribe(Observable或者Subscriber)
也可采用如下方法。

observable.subscribe(new Action1<String>() {
                                 @Override
                                 public void call(String s) {
                                     Log.e(TAG, "call: " + s);
                                 }
                             }, new Action1<Throwable>() {
                                 @Override
                                 public void call(Throwable throwable) {
                                     Log.e(TAG, "call: " + throwable.getMessage());
                                 }
                             }, new Action0() {
                                 @Override
                                 public void call() {
                                     Log.e(TAG, "call: "+"completed" );
                                 }
                             }

        );

4.线程调度

在android当中,线程之间切换是很频繁的,UI线程不能进行耗时操作,而android中耗时操作还是很多的。我们来看下如何进行线程调度。看如下例子。

Observable.just(1,2,3,4)
                .subscribeOn(Schedulers.io())   //subscribe发生在IO线程
                .observeOn(AndroidSchedulers.mainThread())  //指定回调发生在主线程
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.e(TAG, "call: " + integer);
                    }
                });

我们假设1,2,3,4为耗时操作,如操作数据库或者网络请求或者其他,我们通过subscribeOn来指定这些事件发生的线程,通过observeOn来指定回调的线程,

  • Scheduler.io() io线程
  • Scheduler.newThread 新线程
  • Scheduler.immediate 当前线程
  • AndroidSchedulers.mainThread() androidUI线程

5.变换

5.1 map变换

Observable.just("xxx")
                .map(new Func1<String, Bitmap>() {
                    @Override
                    public Bitmap call(String s) {
                        return BitmapFactory.decodeFile(s);
                    }
                })
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
//                        showBitmap(bitmap);

                    }
                });

Funcx函数来实现类型变换。这里是一对一转换

5.2 flatMap转换

实现多对多转化。以抛物线的例子来看。

Student[] students = ...;
Subscriber<Course> subscriber = new Subscriber<Course>() {
    @Override
    public void onNext(Course course) {
        Log.d(tag, course.getName());
    }
    ...
};
Observable.from(students)
    .flatMap(new Func1<Student, Observable<Course>>() {
        @Override
        public Observable<Course> call(Student student) {
            return Observable.from(student.getCourses());
        }
    })
    .subscribe(subscriber);

RxJava何时用

说了那么多RxJava的用法,然而并没有什么乱用。我们说那么多,到头来没什么用岂不是很二。用法请移步大头鬼RxJava使用小结 或者github上的这个rxdemo

总结

若是RxJava+retrofit+lambda+RxBinding等其他现成的Observable,会使我们的代码变得简洁干净,条理清晰。

RxJava的简单学习(学习自扔物线)

原文:http://blog.csdn.net/qq_21430549/article/details/50157885

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!