觀察者模式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() : 在主線程中操做