【Android - 框架】之RxJava的使用

  RxJava算是最新最經常使用的,也是程序員們最喜歡的框架之一了。java

  RxJava的核心由Observable(被觀察者,事件源)和Subscriber(觀察者)構成,Observable負責發出一系列事件,Subscriber處理這些事件。react

  一個Observble能夠發出零個或多個事件,直到結束或出錯。每發出一個事件,就會調用與之關聯的全部觀察者Subscriber的onNext()方法;若是中途出錯,則會回調這個觀察者的onError()方法;事件發佈給全部觀察者以後,會回調最後一個觀察者的onCompleted()方法。android

  RxJava很像設計模式中的觀察者模式,但有一點不一樣,就是當一個被觀察者沒有任何與之關聯的觀察者時,這個被觀察者不會發出任何事件。git

  在Android中使用RxJava,須要先導入RxJava和RxAndroid的依賴:程序員

    compile 'io.reactivex:rxjava:1.2.2'
    compile 'io.reactivex:rxandroid:1.2.1'

DEMO 1:github

        Observable<String> observabele = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello RxJava");
                subscriber.onCompleted();
            }
        });


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

            @Override
            public void onError(Throwable e) {
            }

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

        observabele.subscribe(observer);

  經過Observable的create()方法建立一個自定義的Observable被觀察者,在參數傳入的OnSubscribe內部類中經過調用子方法的Subscriber對象參數的onNext()、onError()、onCompleted()三個方法,操做與這個被觀察者綁定的全部觀察者。設計模式

  經過new Observer()方法來建立一個觀察者,須要實現onNext()、onError()、onCompleted()三個方法。api

  經過Observeable對象的subscribe()方法綁定一個觀察者,此時這個觀察者就能夠接收到被觀察者發送的消息了。數組

DEMO2:網絡

    Observable<String> observable = Observable.just("Hello RxJava", "My", "Name");

        Action1<String> next = new Action1<String>() {
            @Override
            public void call(String s) {
                // onNext()中執行的代碼
            }
        };

        Action1<Throwable> error = new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
                // onError()中執行的代碼
            }
        };

        Action0 completed = new Action0() {
            @Override
            public void call() {
                // onCompleted()中執行的代碼
            }
        };

        observable.subscribe(next, error, completed);

  Subscriber中的三個子方法能夠拆分紅兩個Action1和一個Action0。onNext()和onError()兩個方法對應的Action1,onCompleted()方法對應的是Action0。

  Observable對象的subscribe()方法能夠傳入三個Action對象,即表示被觀察者已經綁定了一個觀察者,這個觀察者是由這三個Action組成的。subscribe()方法有多個重載,能夠只有一個onNext()方法的Action1,能夠有一個onNext()方法的Action1和一個onError()方法的Action1,也能夠像上面代碼同樣有三個Action。

  Observable對象的just()方法能夠有任意個參數,表示將這些對象逐個經過onNext()方法發送出去。

DEMO3:

        String[] array = {"Hello RxJava", "My", "Name"};
        Observable<String> observable = Observable.from(array);

        Action1<String> next = new Action1<String>() {
            @Override
            public void call(String s) {
                // onNext()中執行的代碼
                System.out.println("----------------------->>>>>>>>>>" + s);
            }
        };

        Action1<Throwable> error = new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
                // onError()中執行的代碼
            }
        };

        Action0 completed = new Action0() {
            @Override
            public void call() {
                // onCompleted()中執行的代碼
            }
        };

        observable.subscribe(next, error, completed);

  Observable.from()方法和Observable.just()方法的效果是同樣的,都是將一組數據逐個發送出去,區別是from()方法是將一個數組中的數據逐個發送,而just()方法是將各個參數中的數據進行逐個發送。

DEMO4:

        Observable<String> observable = Observable
                .just("Hello RxJava", "aaaa", "bbbbb", "aaaaaacccc")
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String s) {
                        return "string=========" + s;
                    }
                });

        Action1<String> next = new Action1<String>() {
            @Override
            public void call(String s) {
                // onNext()中執行的代碼
                System.out.println("----------------------->>>>>>>>>>" + s);
            }
        };

        Action1<Throwable> error = new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
                // onError()中執行的代碼
            }
        };

        Action0 completed = new Action0() {
            @Override
            public void call() {
                // onCompleted()中執行的代碼
            }
        };

        observable.subscribe(next, error, completed);

  map方法是將just中的數據進行進一步的處理,例如,上面的代碼中就是在每一個字符串前面加了另外一端字符串。

DEMO5:

        Observable.just("https://api.github.com/users/basil2style")
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String s) {
                        StringBuffer result = null;
                        try {
                            URL url = new URL(s);
                            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                            connection.setRequestMethod("GET");
                            connection.setDoInput(true);
                            connection.connect();
                            int responseCode = connection.getResponseCode();
                            if (responseCode == 200) {
                                result = new StringBuffer();
                                BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
                                byte[] b = new byte[1024];
                                int len = -1;
                                while ((len = bis.read(b)) != -1) {
                                    result.append(new String(b, 0, len));
                                }
                                bis.close();
                            }
                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        System.out.println("------------------->>>>>" + result.toString());
                        return result.toString();
                    }
                })
                .map(new Func1<String, InfoData>() {
                    @Override
                    public InfoData call(String s) {
                        InfoData infoData = new InfoData();
                        try {
                            JSONObject object = new JSONObject(s);
                            infoData.setId(object.getInt("id"));
                            infoData.setUrl(object.getString("url"));
                            infoData.setType(object.getString("type"));
                            infoData.setName(object.getString("name"));
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        return infoData;
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<InfoData>() {
                    @Override
                    public void onCompleted() {
                        System.out.println("---------------------->>>>>>Completed");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Toast.makeText(MainActivity.this, "獲取網絡數據失敗", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onNext(InfoData infoData) {
                        Toast.makeText(MainActivity.this, infoData.getName(), Toast.LENGTH_SHORT).show();
                    }
                });

  這是用RxJava結合原生的JAVA API完成網絡訪問的代碼,經過map()方法在不一樣的參數之間進行轉換,最終獲得InfoData對象並輸出數據。

  如今,開發人員更喜歡將RxJava和Retrofit結合使用,緣由是RxJava能夠設置一段代碼執行的線程,這樣就能夠輕鬆的、解耦的替換Handler和AsyncTask進行異步數據的訪問。

  有關RxJava和Retrofit結合使用的案例我會寫在個人下一個帖子中,敬請期待~~

相關文章
相關標籤/搜索