編輯:關於android開發
對rxJava不了解的同學可以先看
RxJava 和 RxAndroid 一 (基礎)
RxJava 和 RxAndroid 二(操作符的使用)
RxJava 和 RxAndroid 三(生命周期控制和內存優化)
RxJava 和 RxAndroid 四(RxBinding的使用)
本文將有幾個例子說明,rxjava線程調度的正確使用姿勢。
例1
Observable
.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
Logger.v( "rx_call" , Thread.currentThread().getName() );
subscriber.onNext( "dd");
subscriber.onCompleted();
}
})
.map(new Func1<String, String >() {
@Override
public String call(String s) {
Logger.v( "rx_map" , Thread.currentThread().getName() );
return s + "88";
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Logger.v( "rx_subscribe" , Thread.currentThread().getName() );
}
}) ;
結果
/rx_call: main -- 主線程
/rx_map: main -- 主線程
/rx_subscribe: main -- 主線程
例2
new Thread(new Runnable() {
@Override
public void run() {
Logger.v( "rx_newThread" , Thread.currentThread().getName() );
rx();
}
}).start();
void rx(){
Observable
.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
Logger.v( "rx_call" , Thread.currentThread().getName() );
subscriber.onNext( "dd");
subscriber.onCompleted();
}
})
.map(new Func1<String, String >() {
@Override
public String call(String s) {
Logger.v( "rx_map" , Thread.currentThread().getName() );
return s + "88";
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Logger.v( "rx_subscribe" , Thread.currentThread().getName() );
}
}) ;
}
結果
/rx_newThread: Thread-564 -- 子線程
/rx_call: Thread-564 -- 子線程
/rx_map: Thread-564 -- 子線程
/rx_subscribe: Thread-564 -- 子線程
例3
Observable
.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
Logger.v( "rx_call" , Thread.currentThread().getName() );
subscriber.onNext( "dd");
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Func1<String, String >() {
@Override
public String call(String s) {
Logger.v( "rx_map" , Thread.currentThread().getName() );
return s + "88";
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Logger.v( "rx_subscribe" , Thread.currentThread().getName() );
}
}) ;
結果
/rx_call: RxCachedThreadScheduler-1 --io線程
/rx_map: main --主線程
/rx_subscribe: main --主線程
例4
Observable
.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
Logger.v( "rx_call" , Thread.currentThread().getName() );
subscriber.onNext( "dd");
subscriber.onCompleted();
}
})
.map(new Func1<String, String >() {
@Override
public String call(String s) {
Logger.v( "rx_map" , Thread.currentThread().getName() );
return s + "88";
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Logger.v( "rx_subscribe" , Thread.currentThread().getName() );
}
}) ;
結果
/rx_call: RxCachedThreadScheduler-1 --io線程
/rx_map: RxCachedThreadScheduler-1 --io線程
/rx_subscribe: main --主線程
map() , flapMap() , scan() , filter() 等 -- 事件加工
subscribe() -- 事件消費
事件加工:默認跟事件產生的線程保持一致, 可以由 observeOn() 自定義線程
事件消費:默認運行在當前線程,可以有observeOn() 自定義
例5 多次切換線程
Observable
.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
Logger.v( "rx_call" , Thread.currentThread().getName() );
subscriber.onNext( "dd");
subscriber.onCompleted();
}
})
.observeOn( Schedulers.newThread() ) //新線程
.map(new Func1<String, String >() {
@Override
public String call(String s) {
Logger.v( "rx_map" , Thread.currentThread().getName() );
return s + "88";
}
})
.observeOn( Schedulers.io() ) //io線程
.filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
Logger.v( "rx_filter" , Thread.currentThread().getName() );
return s != null ;
}
})
.subscribeOn(Schedulers.io()) //定義事件產生線程:io線程
.observeOn(AndroidSchedulers.mainThread()) //事件消費線程:主線程
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Logger.v( "rx_subscribe" , Thread.currentThread().getName() );
}
}) ;
結果
/rx_call: RxCachedThreadScheduler-1 -- io 線程
/rx_map: RxNewThreadScheduler-1 -- new出來的線程
/rx_filter: RxCachedThreadScheduler-2 -- io線程
/rx_subscribe: main -- 主線程
perf profiling 分析程序性能
perf profiling 分析程序性能perf profiling 分析程序性能程序性能分析perf 有一個功能就是按一定頻率采集某一個程序的調用棧,然後對調用棧進行
如何避免TCP的TIME_WAIT狀態
如何避免TCP的TIME_WAIT狀態如何避免TCP的TIME_WAIT狀態——lvyilong316關於TCP連接的TIME-WAIT狀態,它是為何而生,存在的意義是什
Android中使用Notification實現普通通知欄(Notification示例一),rest示例java實現
Android中使用Notification實現普通通知欄(Notification示例一),rest示例java實現Notification是在你的應用常規界面之外展示
Android Studio多渠道打包
Android Studio多渠道打包 我們開發一個APP在上傳應用市場之前,有時候會遇到要根據不同平台打多個apk包的問題。由於Android的應用市場比較多,主流的應
Android動畫效果生動有趣的通知NiftyNotification(Android Toast替代品),androidnotification
Android動畫效果生動有趣的通知NiftyNotification(