什麼是響應式編程
經過異步和數據流來構建事務關係的編程模型
算法
舉例
app啓動時, 先初始化sdk, 初始化數據庫, 登陸, 都成功後跳轉首頁, 他們都須要耗時操做數據庫
Observable.just(context)
.map((context)->{login(getUserId(context))})
.map((context)->{initSDK(context)})
.map((context)->{initDatabase(context)})
.subscribeOn(Schedulers.newThread())
.subscribe((context)->{startActivity()})
複製代碼
Observable obserInitSDK=Observable.create((context)->{ initSDK(context) }).subscribeOn(Schedulers.newThread())
Observable obserInitDB=Observable.create((context)->{ initDatabase(context) }).subscribeOn(Schedulers.newThread())
Observable obserLogin=Observable.create((context)->{ login(getUserId(context)) })
.map((isLogin)->{ return Context() })
.subscribeOn(Schedulers.newThread())
Observable observable = Observable.merge(obserInitSDK,obserInitDB,obserLogin)
observable.subscribe(()->{startActivity()})
複製代碼
建立被觀察者的幾種方式編程
//1
Observable switcher = Observable.create(new Observable.OnSubscribe<String>(){
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("On");
subscriber.onCompleted();
}
});
//2
Observable switche r= Observable.just("On","Off","On","On");
//3
String [] kk={"On","Off","On","On"};
Observable switcher = Observable.from(kk);
複製代碼
建立觀察者的幾種方式bash
//1
Subscriber light = new Subscriber<String>() {
@Override
public void onCompleted() {
//被觀察者的onCompleted()事件會走到這裏;
Log.d("DDDDDD","結束觀察...\n");
}
@Override
public void onError(Throwable e) {
//出現錯誤會調用這個方法
}
@Override
public void onNext(String s) {
//處理傳過來的onNext事件
Log.d("DDDDD","handle this---"+s)
}
//2 偷懶(非正式寫法)
Action1 light = new Action1<String>() {
@Override
public void call(String s) {
Log.d("DDDDD","handle this---"+s)
}
}
複製代碼
將二者訂閱在一塊兒數據結構
switcher.subscribe(light);
複製代碼
之因此「開關訂閱檯燈」, 是爲了保證流式API調用風格app
Map類型變換異步
Observable.just(getFilePath()
.subscribeOn(Schedulers.newThread()) //指定了被觀察者執行的線程環境
.observeOn(Schedulers.io()) //將接下來執行的線程環境指定爲io線程
//使用map操做來完成類型轉換
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String s) {
return createBitmapFromPath(s); //方法,是一個極其耗時的操做
}
})
.observeOn(AndroidSchedulers.mainThread()) //將後面執行的線程環境切換爲主線程
.subscribe(
new Subscriber<Bitmap>() { //建立觀察者,做爲事件傳遞的終點處理事件
@Override
public void onNext(Bitmap s) {
showBitmap(s) //處理事件
}
);
複製代碼
FlatMapide
//建立被觀察者,獲取全部班級
Observable.from(getSchoolClasses())
.flatMap(new Func1<SingleClass, Observable<Student>>() {
@Override
public Observable<Student> call(SingleClass singleClass) {
//將每一個班級的全部學生做爲一列表包裝成一列Observable<Student>,將學生一個一個傳遞出去
return Observable.from(singleClass.getStudents()); //返回Observable
}
})
.subscribe(
//建立觀察者,做爲事件傳遞的終點處理事件
new Subscriber<Student>() {
@Override
public void onNext(Student student) {
//接受到每一個學生類
Log.d("DDDDDD",student.getName())
}
);
複製代碼
FlatMap能夠再次包裝新的Observable,而每一個Observable均可以使用from(T[])方法來建立本身ui
map和flatmap的原理this
粘性事件:就是能夠接收訂閱以前的事件
ViewMode+LiveData 模式 編譯原理,數據結構,操做系統,計算機組成原理 KMP算法