- 了解RxJava也蠻久了,原來一直不了解其中的原理产舞,尤其是配合Retrofit組合之后線程切換和類型轉換老是暈魂奥,剛剛有些理解、 乘熱打鐵易猫,記錄一下耻煤。
1.RxJava基本邏輯
-
添加依賴
RXjava compile 'io.reactivex:rxjava:1.2.4' compile 'io.reactivex:rxandroid:1.2.1' ---Retrofit配合Rxjava compile 'com.squareup.retrofit2:retrofit:2.1.0'//retrofit依賴 compile 'com.squareup.retrofit2:converter-gson:2.1.0'//gson轉換器 compile 'com.squareup.retrofit2:converter-scalars:2.1.0'//標準類型轉換器 compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'//rxjava轉換器 ---Rxbinding依賴 compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'
-
Lambda配置(可忽略)
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}//添加在Android下面的編譯配置dependencies { classpath 'com.android.tools.build:gradle:2.2.3' classpath 'me.tatarka:gradle-retrolambda:3.4.0'//插件下載路徑 // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } apply plugin: 'me.tatarka.retrolambda'//運用插件
Rxjava運用觀察者模式、通過觀察者(Observer)/訂戶(Subscriber )來訂閱被觀察者
為了更好使用鏈式編程擦囊、使用的是被觀察者訂閱觀察者(為了可以使用鏈式編程使得語義相反)
observable.subscribe(subscriber/observer);
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("dfjhsklafj");
subscriber.onNext("a");
}
}).subscribeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String o) {
}
});
Observable.create 傳入OnSubsecible接口變量實現(xiàn)onCall方法
也可以使用from來獲取本地數(shù)組資源
Observable.from(getResources().getStringArray(R.array.RX)).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("s = " + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
});
被觀察者可以使用just代替create傳遞1--10個參數(shù)
觀察者/訂閱者可以使用Action來替代它的三個參數(shù)
/**
* 簡化觀察者违霞,用方法Action1代替觀察者的接口三個方法,選擇要使用的1--3方法
*/
private void Action1(){
Observable.just('a').subscribe(new Action1<Character>() {
@Override
public void call(Character s) {
System.out.println("s = " + s);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
}
}, new Action0() {
@Override
public void call() {
}
});
上述可以使用Lambda表達式簡化邏輯
只執(zhí)行觀察者Action1的onNext方法
Observable.create((f)->f.onNext('a')).subscribe((c)-> System.out.println("c = " + c))
三個方法Action1瞬场、Action1买鸽、Action0都執(zhí)行
Observable.just('a','b').subscribe(
(num)->Log.e("s","s" +num),
(ex)-> ex.printStackTrace(),
()-> System.out.println(" = " )
);
線程切換(從上往下找)
//Schedulers
//IO()網(wǎng)絡線程、無法控制最大線程數(shù)量
// newThread()開啟新的線程贯被、
// immediate()當前線程默認眼五、
// computation()計算線程會計算當前cpu個數(shù)來決定開多少線程,有效控制線 程最大數(shù)量
//AndroidSchedulers.mainThread()主線程
subScribeOn()訂閱發(fā)生所在線程(語義是被觀察者訂閱觀察者),所以是被觀察者線程
observeOn()執(zhí)行觀察者處理數(shù)據(jù)所在線程
doOnScrible
*subscribeOn()
: 指定subscribe()
所發(fā)生的線程彤灶,即Observable.OnSubscribe
被激活時所處的線程看幼。或者叫做事件產(chǎn)生的線程幌陕。 *observeOn()
: 指定Subscriber
所運行在的線程诵姜。或者叫做事件消費的線程搏熄。
添加進度框
-
map:將被觀察者數(shù)據(jù)類型轉換為其他類型Fun1
Observable.just(path) .map(new Func1<String, CharSequence>() { @Override public CharSequence call(String s) { return getData(s);//將數(shù)據(jù)路徑讀取成字符串 } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe((next) -> tv.setText(next));
flatMap:被觀察者二次變幻轉成新的觀察者->橋接模式
區(qū)別:map第二個參數(shù)為目標類型
flatMap : 第二個參數(shù)是另一個被觀察者對象的類型
lift:觀察者類型轉換棚唆,類似于map暇赤,但是處理轉換的是觀察者
compose:轉換的是被觀察的對象,接口名是Transformer
1
數(shù)據(jù)配合Rxjava進行Retrofit網(wǎng)絡請求
-
retrofit請求后返回call對象通過rxjavaAdapter轉換成被觀察者對象宵凌,然后在給處理后給觀察者對象
1.網(wǎng)絡請求接口使用被觀察者對象
{path}放入url路徑相對名字
@Query(s) String q //查詢的鍵值對xx?s=q
@URL String url //表示url路徑如果寫了base url 會根據(jù)http是否開頭只能判斷是否加載全部url@GET("/dianying/v2/search/movies.json") Observable<News> getNews(@Query("client") String client);
2.轉換加載數(shù)據(jù)
new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())//字符串轉換器
.addConverterFactory(GsonConverterFactory.create())//json轉換器
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//Call->rxJava適配器P摇!瞎惫!執(zhí)行完call后返回被觀察者實體類對象
.build().create(NewsServiceNet.class)//接口類
.getNews(str)//獲取數(shù)據(jù)
.subscribeOn(Schedulers.io())//被觀察者訂閱在io線程
.observeOn(AndroidSchedulers.mainThread())//觀察者在主線程執(zhí)行
.subscribe(
(news)->{
if (news == null) {
Toast.makeText(this, "無", Toast.LENGTH_SHORT).show();
}
List<News.Data> data = news.getData();
System.out.println("data = " + data);
tv.setText(data.toString());
},
Throwable::printStackTrace
);//訂閱者處理事件
RxBinding
RxView.clicks(iv).throttleWithTimeout(1000, TimeUnit.MILLISECONDS).subscribe(
(v)->loadData()
);//防抖時間溜腐,觀察者執(zhí)行點擊事件
RXBus
- 類型EventBus出現(xiàn),使用Rx鏈式思想
未完待續(xù)