前言
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é)果如下:

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
作者
- github:leibing@github
- email:leibing1989@126.com
- qq:872721111