首先 在這裡放上兩個庫的位址
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
在android studio 中 我們可以添加依賴
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
在我看來 Rxjava 是異步,簡潔的代名詞,
可能自己了解的不夠深入,目前,自己隻是在自己的項目中簡單的應用了他最基本的功能,讓他進行開辟線程 異步操作, 其中的map函數式程式設計 是他的主要應用.
RxJava 由三個部分組成 Observable可觀察的對象 ,subscribe訂閱者,Scheduler線程控制 .
他的流程上是:建立的Observable對象 ,所有Observer一旦訂閱這個Observable就會立即調用onNext()方法并傳入Observable.的的參數,而後因為Observable沒有資料可以發送了,onComplete()方法會被調用。
Rxjava 的學習曲線之是以陡峭 ,是因為他的方法庫太多,而且程式設計思想不同,例如在Observable
中 map, flatMap ,filter,doOnNext等等,
接下來 來介紹它的主要應用
1.RxAndroid 基本的應用(異步)
private void asyncSave() {
saveObservable = Observable.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {//通知調用 并傳回string
return savePic(file, bitmap);//此方法在io線程中調用 并傳回
}
});
saveSubscription = saveObservable
.subscribeOn(Schedulers.io())//observable在排程中的IO線程中進行排程進行
.observeOn(AndroidSchedulers.mainThread())//在主線程中進行觀察
.subscribe(new Observer<String>() { //訂閱觀察者
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {//帶參數的下一步,在此就是當
textView.setText("saveSubscription: save sucessful ,the file name is " + s);
}
});
}
2.RxAndorid 中single應用
private void singleObservable() {
Single<String> stringSingle = Single.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
return savePic(file, bitmap);
}
});
mSingleSubscriber = stringSingle
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleSubscriber<String>() {
@Override
public void onSuccess(String value) {
textView.setText("mSingleSubscriber: save sucessful ,the file name is " + value);
}
@Override
public void onError(Throwable error) {
}
});
}
3.RxAndroid中map應用
private void createObservables() {
mSearchResultsSubject = PublishSubject.create();
mTextWatchSubscription = mSearchResultsSubject
.debounce(400, TimeUnit.MILLISECONDS)//去抖動
.observeOn(Schedulers.io())
.map(new Func1<String, List<String>>() {//map函數式程式設計
@Override
public List<String> call(String s) {
return mRestClient.searchForCity(s);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<String>>() {//訂閱并進行處理
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<String> cities) {//這裡的cities 是一個整體,next
handleSearchResults(cities);
}
});
}
private void getFile(List<File> folders){//
Observable.from(folders)//在背景,用來代替for循環,以及其中的邏輯判斷
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {//将list 中的每一個都分别處理 好比foreach
return Observable.from(file.listFiles());
}
})
.filter(new Func1<File, Boolean>() {//過濾
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1<File, Bitmap>() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {//list中的資料 一個個的next
ImageView imageView =new ImageView(getBaseContext());
imageView.setImageBitmap(bitmap);
imageCollectorView.addView(imageView);
}
});
}
4. 避免記憶體洩露
當activity結束時,要調用 如下, 避免記憶體洩露,因為涉及到線程問題時候,都會出現記憶體問題
@Override
protected void onDestroy() {
super.onDestroy();
if (mTextWatchSubscription != null && !mTextWatchSubscription.isUnsubscribed()) {
mTextWatchSubscription.unsubscribe();
}
}
Rxandroid 還有一些其他的用法,比如請求網絡,rxBus等等,.在請求網絡上 用volley ,xutils即可,在事件總線上,用eventBus,是以在此就不再讨論這些的情況
Rxandroid 是一個工具,一般用來替代handle 和asynctasic類這種容易引發記憶體洩露的方法,還有就是 用來簡化代碼邏輯結構,
我想僅對于應用層面,上面這些應該夠用了,寫這篇文章,是為了我們更好的學習, 歡迎大家指正,提問~
關于rxandroid 更深層次的問題,還希望我們一起共同探索,我也會在後期的博文中繼續研究其中的原理~~
大家一起努力吧!!!
關于項目的Demo(寫了那麼多,也不容易,給個贊吧~~~謝謝) :https://github.com/ccj659/myRxAndroid.git