后期项目需要用RxJava和Rxandroid框架,趁着闲暇时间,学习一下框架。就从简单的demo开始,窥探这个异步框架的冰山一角。(建议打开编译工具,边看文章边源码,因为逻辑有点绕)废话不多说,直接上代码。
另外说一下rxjava和rxandroid引用的版本
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
package com.test.dxy;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rxJavaInit();
}
private void rxJavaInit(){
new Thread(new Runnable() {
@Override
public void run() {
Observable.create(new ObservableOnSubscribe<String>() {//create创建产生的实例类型ObservableCreate<T>
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
Log.i("MainActivity",Thread.currentThread().getId()+":"+Thread.currentThread().getName());
emitter.onNext("hello");
emitter.onNext("world");
emitter.onComplete();
}
}).subscribeOn(Schedulers.newThread())//subscribeOn创建产生的实例类型ObservableSubscribeOn<T>
.observeOn(AndroidSchedulers.mainThread()) //observeOn创建产生的实例类型ObservableObserveOn<T>
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.i("MainActivity","onSubscribe"+Thread.currentThread().getId()+":"+Thread.currentThread().getName());
}
@Override
public void onNext(String s) {
Log.i("MainActivity",Thread.currentThread().getId()+":"+Thread.currentThread().getName());
Log.i("MainActivity",s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.i("MainActivity",Thread.currentThread().getId()+":"+Thread.currentThread().getName());
Log.i("MainActivity","onComplete");
}
});
}
}).start();
}
}
<样例代码片段1>
把代码跑起来,下面是打印的日志信息
从日志中可以看到Observer的onSubscribe(Disposable d)方法运行在一个线程中,而Observer的其他回调(onNext,onError,onComplete)运行在主线程中,ObservableOnSubscribe中的subscribe方法运行在另外一个线程中,和Observer的nSubscribe(Dis