Rxjava實踐之路[入門篇]

前言

Github Rxjava主頁是這樣描述:a library for composing asynchronous and event-based programs using observable sequences for the Java VM(一個在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫)。說白了,Rxjava就是一個實現(xiàn)異步操作的庫,用來取代AsynTask、handler + Thread等。之所以越來越多的開發(fā)者崇尚Rxjava技術(shù),其中最主要的原因在于其簡潔,隨著程序邏輯變得越來越復(fù)雜,它依然能夠保持簡潔。RxJava 的異步實現(xiàn),是通過一種擴(kuò)展的觀察者模式來實現(xiàn)的。關(guān)于Rxjava詳細(xì)原理就不講解了,因為這個意義并不是太大,如何上手使用才是王道!

Usage

此處我只針對android studio開發(fā)做講解,謝謝大家理解。
首先引入依賴庫如下:

dependencies {
    compile 'io.reactivex:rxjava:1.0.14'
    compile 'io.reactivex:rxandroid:1.0.1'
}

接下來拋磚如玉做基本使用總結(jié)。
有了解過Rxjava的童鞋應(yīng)該知道Rxjava主要由三部分組成:Observable(被觀察者)、Subscriber(觀察者)、subscribe(訂閱)。被觀察者通過訂閱被觀察者所觀察,觀察者通過訂閱第一時間熟知被觀察者的一舉一動。接下來講解一下有那些創(chuàng)建Observable(被觀察者)的方式,以及這些Observable的作用。

1、create observable

    /**
     * create Observable
     * @author leibing
     * @createTime 2016/09/13
     * @lastModify 2016/09/13
     * @param
     * @return
     */
    private void createObservable() {
        // 通過create創(chuàng)建observable對象,在call中調(diào)用subscriber的onnext方法
        Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                for (int i = 0; i < 20; i++) {
                    subscriber.onNext("i = " + i);
                }
                subscriber.onCompleted();
            }
        });
        // 上面的代碼我們已經(jīng)構(gòu)建了一個觀察者,我們接下來新建一個訂閱者
        Subscriber<String> subscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {
                System.out.println("dddddddddddd create complete");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("ddddddddddd create error");
            }

            @Override
            public void onNext(String s) {
                System.out.println("dddddddddddd  create " + s);
            }
        };
        // 通過調(diào)用subscribe方法使觀察者和訂閱者產(chǎn)生關(guān)聯(lián),一旦訂閱就觀察者就開始發(fā)送消息
        observable.subscribe(subscriber);
    }

運行結(jié)果如下:

 09-18 11:07:36.462 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 0
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 1
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 2
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 3
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 4
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 5
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 6
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 7
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 8
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 9
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 10
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 11
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 12
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 13
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 14
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 15
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 16
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 17
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 18
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd  create i = 19
09-18 11:07:36.463 27973-27973/cn.jianke.rxjavademo I/System.out: dddddddddddd create complete

2、 just observable

    /**
     * 根據(jù)圖片的url路徑獲得Bitmap對象
     * @author leibing
     * @createTime 2016/09/17
     * @lastModify 2016/09/17
     * @param url
     * @return
     */
    private Bitmap returnBitmap(String url) {
        URL fileUrl = null;
        Bitmap bitmap = null;
        try {
            fileUrl = new URL(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try {
            HttpURLConnection conn = (HttpURLConnection) fileUrl
                    .openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    /**
     * 用map變換字符串為bitmap
     * @author leibing
     * @createTime 2016/09/17
     * @lastModify 2016/09/17
     * @param
     * @return
     */
    private void justShowImg() {
        mProgressSwip.setRefreshing(true);
        // 圖片地址
        String url = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&" +
                "quality=100&size=b4000_4000&sec=1474106737&di=8432956a8f4868587" +
                "5f64ca01246f81f&src=http://g.hiphotos.baidu.com/imgad/pic/item/" +
                "f603918fa0ec08fa9f0b7dd85eee3d6d55fbda42.jpg";
        // map變換將url轉(zhuǎn)換成bitmap
        Observable.just(url).map(new Func1<String, Bitmap>() {
            @Override
            public Bitmap call(String s) {
                // 通過url拿去bitmap
                return returnBitmap(s);
            }
        }).subscribeOn(Schedulers.io()). // 訂閱在io線程
                observeOn(AndroidSchedulers.mainThread()) //發(fā)送在UI線程(處理更新UI)
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
                        // 發(fā)送后處理更新UI
                        mProgressSwip.setRefreshing(false);
                        showIv.setImageBitmap(bitmap);
                    }
                });
    }

運行結(jié)果如下:

just.gif

3、from observable

    /**
     * 集合操作
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void fromObservable() {
        List<String> fromList = new ArrayList<>();
        fromList.add("1");
        fromList.add("2");
        fromList.add("3");
        Observable.from(fromList).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                System.out.println("ddddddddddddddd from s = " + s);
            }
        });
    }

運行結(jié)果如下:

09-18 11:40:46.716 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddd from s = 1
09-18 11:40:46.716 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddd from s = 2
09-18 11:40:46.716 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddd from s = 3

4、 repeat observable

    /**
     * 重復(fù)操作
     * @author leibing
     * @createTime 2016/09/08
     * @lastModify 2016/09/08
     * @param
     * @return
     */
    private void repeatObservable(){
        List<Integer> integers = new ArrayList<>();
        integers.add(0);
        integers.add(1);
        integers.add(2);
        integers.add(3);
        Observable.from(integers).repeat(2).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                System.out.println("ddddddddddddddddddd repeat integer = " + integer);
            }
        });
    }

運行結(jié)果如下:

09-18 11:42:44.486 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddddd repeat integer = 0
09-18 11:42:44.486 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddddd repeat integer = 1
09-18 11:42:44.486 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddddd repeat integer = 2
09-18 11:42:44.486 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddddd repeat integer = 3
09-18 11:42:44.487 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddddd repeat integer = 0
09-18 11:42:44.487 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddddd repeat integer = 1
09-18 11:42:44.487 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddddd repeat integer = 2
09-18 11:42:44.487 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddddd repeat integer = 3

5、range observable

    /**
     * 范圍操作
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void rangeObservable() {
        // 從指定的數(shù)字x開始發(fā)射n個數(shù)字
        Observable.range(15, 5).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                System.out.println("ddddddddddddddddd range integer = " + integer);
            }
        });
    }

運行結(jié)果如下:

09-18 11:44:06.424 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd range integer = 15
09-18 11:44:06.426 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd range integer = 16
09-18 11:44:06.426 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd range integer = 17
09-18 11:44:06.427 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd range integer = 18
09-18 11:44:06.428 27973-27973/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd range integer = 19

6、interval observable


    /**
     * 輪詢操作
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void intervalObservable() {
        // 指定輪詢時間(第一個參數(shù))為x,輪詢時間單位(第二個參數(shù))為n開始輪詢處理事件.
        Observable.interval(2, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
            @Override
            public void call(Long aLong) {
                System.out.println("ddddddddddddddddd interval aLong = " + aLong);
            }
        });
    }

運行結(jié)果如下:

09-18 11:45:22.599 27973-20494/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd interval aLong = 0
09-18 11:45:24.600 27973-20494/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd interval aLong = 1
09-18 11:45:26.600 27973-20494/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd interval aLong = 2
                                                                  
                                                                  [ 09-18 11:45:26.610   245:0xf5 I/         ]
                                                                  [BWC INFO](245): get_bwc_mm_property success
09-18 11:45:28.600 27973-20494/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd interval aLong = 3
                                                                  
                                                                  [ 09-18 11:45:28.724   245:0xf5 I/         ]
                                                                  [BWC INFO](245): get_bwc_mm_property success
09-18 11:45:30.599 27973-20494/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd interval aLong = 4
09-18 11:45:32.600 27973-20494/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd interval aLong = 5

7、timer observable

    /**
     * 定時器操作
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void timerObservable() {
        // 指定一定時間后才發(fā)射
        Observable.timer(4, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
            @Override
            public void call(Long aLong) {
                System.out.println("ddddddddddddddddd timer along = " + aLong);
            }
        });
    }

運行結(jié)果如下:

09-18 11:49:31.393 22687-22756/cn.jianke.rxjavademo I/System.out: ddddddddddddddddd timer along = 0

總結(jié)

Rxjava最基本用法已做介紹,相信大家對Rxjava有了初步的理解,看那么多通篇大論,還不如自己動手寫demo測試驗證,多看看,多寫寫,大家一起進(jìn)步,文章寫得一般,俗氣,只為更好地理解。歡迎大家拍磚!
demo地址:RxjavaDemo

作者

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容