Rxjava

 观察者模式java

观察者模式三个角色react

观察者:监视被观察者的行为,当被观察者的某个状态改变的时候,观察者会进行对应的操做android

被观察者:被监视的对象,当某个状态改变的时候会通知观察者数据库

订阅:帮观察者和被观察者创建关系网络

 

Rxjava异步

使用可观测的序列来组成异步的 基于事件的程序的库ide

rxjava 是程序的库 是异步 基于事件的 使用可观测的序列来组成  线程

 

Rxjava 运用观察者模式code

三个角色是server

一、观察者 是 Observer : 决定事件触发的时候有怎样的行为,换句话说当被观察者某个状态改变时,观察者应该作些什么行为.Rxjava观察者的事件回调方法有普通事件onNext().还有特殊事件onCompleted()和onError().

onNext():至关于被观察者button触发点击行为,观察者onClickListener()把处理行为回调给了onClick()方法.

onCompleted() 事件队列完成完结.Rxjava不只把每一个事件单独处理,还会把它们当作一个队列。Rxjava规定当再也不发出onNext(),须要触发onCompleted()做为标志完结

onError() 事件队列异常.在事件处理异常时,会触发onError(),同时队列自动中止,不容许再有事件触发

备注:在一个正常运行的事件序列中,onCompleted()和onErro()有且只有一个,而且是事件序列的最后一个.onCompleted()和onError(是相互排斥的,即在队列中调用一个就不应再调用另外一个

二、被观察者 是 Observable,它决定何时触发以及触发什么样的事件,可使用create()、just(T...)、from(T[])、from(Iterable<? extend ?>)来建立一个Observable,并为它定义触发规则

三、订阅 是 subscribe().在Observer和Observable建立之后,再用subscribe()把它们联系起来

代码运用:

一、依赖

compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'

二、代码简单编写

Observer<String> observer = new Observer<String>() {
                    @Override
                    public void onCompleted() {
                        System.out.println("--data-completed");
                    }

                    @Override
                    public void onError(Throwable e) {
                        System.out.println("--data-"+e.getMessage());
                    }

                    @Override
                    public void onNext(String s) {
                        System.out.println("--data-"+s);
                    }
                };

                Subscriber<String> subscriber = new Subscriber<String>() {

                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {

                    }

                    @Override
                    public void onStart() {
                        super.onStart();
                    }

                };

//                Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
//
//                    @Override
//                    public void call(Subscriber<? super String> subscriber) {
//                        subscriber.onNext("hello");
//                        subscriber.onNext("world");
//                        subscriber.onCompleted();
//                    }
//                });
//                Observable observable = Observable.just("h", "w");
//                Observable observable = Observable.from(new String[] {"gg", "sss"});
                List<String> list = new ArrayList<>();
                list.add("1");
                list.add("2");
                Observable observable = Observable.from(list);
                observable.subscribe(observer);
//                observable.subscribe(subscriber);

Action

Action用法:简化代码,若不想实现观察者Observer中onError()、onCompleted()

Observable.from(new String[] {"sss","aaa"}).subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        System.out.println("--data"+s);
                    }
                });

Action是Rxjava的一个接口,分开实现替代onNext()、onError()、onCompleted()

Action1<String> nextAction = new Action1<String>() {
    @Override
    public void call(String s) {
        System.out.println("--data"+s);
    }
};
Action1<Throwable> onErrorAction = new Action1<Throwable>() {
    @Override
    public void call(Throwable throwable) {

    }
};
Action0 action0 = new Action0() {
    @Override
    public void call() {

    }
};
Observable.from(new String[]{"1111"}).subscribe(nextAction, onErrorAction, action0);

Action0 : 它只有一个方法call()无参数无返回值,onCompleted()也是无参数无返回值.所以Action0能够被看成一个包装对象,将onCompleted()的内容打包起来将本身做为一个参数传入subscribe()中以实现不完整的回调.

Action1:它只有一个call()无返回值,可是有参数,与oNext(String s)、onError(Throwable t)一样是有参数无返回值,同上能够传入到subscribe()中实现不完整定义的回调.

 

Rxjava Map的使用 类型转换 规定输出的值

一、Func1介绍

Func1与上文的Action1类似,不一样的是Func1有返回值

Student s1 = new Student();
                s1.setAge("11");
                s1.setName("s");
                Student s2 = new Student();
                s2.setName("a");
                s2.setAge("22");
                Observable.just(s1, s2).map(new Func1<Student, String>() {
                    @Override
                    public String call(Student student) {
                        return student.getName();
                    }
                }).map(new Func1<String, Integer>() {
                    @Override
                    public Integer call(String s) {
                        return s.hashCode();
                    }
                }).map(new Func1<Integer, String>() {
                    @Override
                    public String call(Integer integer) {
                        return integer+"";
                    }
                }).subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        System.out.println("--data"+s);
                    }
                });

Rxjava flatMap的使用

一对多

List<Student> mlist = new ArrayList<>();
                Student s1 = new Student();
                s1.setAge("22");
                s1.setName("a");
                List<Course> courses = new ArrayList<>();
                final Course course = new Course();
                course.setId("1");
                course.setName("sss");
                courses.add(course);
                s1.setMlist(courses);
                mlist.add(s1);
                Observable.from(mlist).flatMap(new Func1<Student, Observable<Course>>() {
                    @Override
                    public Observable<Course> call(Student student) {
                        return Observable.from(student.getMlist());
                    }
                }).subscribe(new Action1<Course>() {
                    @Override
                    public void call(Course course) {
                        System.out.println("--data"+course.getName());
                    }
                });

 

Scheduler 线程控制器,能够指定每一段代码在什么样的线程中执行。

Observable.just("1", "2")
                        .subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Observer<String>() {
                            @Override
                            public void onCompleted() {

                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onNext(String s) {

                            }
                        });

代码中的subscribeOn()指定发生的线程.observerOn()指定消费的线程

Scheduler.immediate() :直接在当前线程中运行

Scheduler.newThread() :老是启动新线程

Scheduler.io : 读写文件、网络信息交互、数据库读写.与newThread()差很少,区别io是一个无数量上限的线程池.能够重用空闲的线程。

Scheduler.computation():计算所使用的Scheduler.

AndroidScheduler.mainThread() : 在主线程中操做

相关文章
相关标签/搜索