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() : 在主線程中操做

相關文章
相關標籤/搜索