/**
* onStart里面异常不走onError
*/
public class MainActivity extends AppCompatActivity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
doOnNext();
}
});
}
/**
* 测试doOnNext处于哪个线程。是否跟随着subscribe中的onNext同一个线程。
*/
private void doOnNext() {
Observable.just(new Student("jack", 23, null))
.map(new Func1<Student, String>() {
@Override
public String call(Student student) {
return student.getName();
}
}).doOnNext(new Action1<String>() {
@Override
public void call(String s) {
Log.e("MainActivity", "doOnNext:" + s);
Log.e("MainActivity", "doOnNext:" + Thread.currentThread().getName());
}
})
//.observeOn(AndroidSchedulers.mainThread()) // 发现doOnNext也在主线程中执行。
.observeOn(Schedulers.io()) // subcribe()里面的onNext()在子线程中执行,但是doOnNext在主线程中
.subscribe(new Subscriber<String>() {
@Override
public void onNext(String name) {
Log.e("MainActivity", name);
Log.e("MainActivity", "subscribe():" + Thread.currentThread().getName());
}
@Override
public void onCompleted() {
Log.e("MainActivity", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e("MainActivity", "onError");
}
});
}}
总结:通过测试可以发现doOnNext()函数执行的地方跟subcribe()中的onNext()执行的地方没有必然联系。
doOnNext()的执行在onNext()之前,对数据进行相关处理。