使用Rxjava需要加入两个依赖:
compile ‘io.reactivex:rxjava:1.0.14’
compile ‘io.reactivex:rxandroid:1.0.1’
结合Retrofit使用加入的依赖
compile ‘com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0’
Rxjava用在异步操作上面 理解为网上大佬们说的警察和小偷
Observa: 观察者|警察
Observable :被观察者|小偷
当小偷|被观察者做出动作(偷东西的动作,指定动作),警察|观察者就要做出反应去抓他(响应操作)
//简单使用
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//观察者,消费事件
final Observer<String> observer = new Observer<String>() {
//完成
@Override
public void onCompleted() {
Log.e("observer", "onCompleted");
}
//异常
@Override
public void onError(Throwable e) {
Log.e("observer", "onError");
}
//发出
@Override
public void onNext(String s) {
Log.e("观察者", "线程:" + s+Thread.currentThread().getName());
}
};
//被观察者,生成数据
final Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
//生成数据。。。
subscriber.onNext("1");
subscriber.onNext("2");
subscriber.onNext("3");
//完成
//调用onCompleted后的方法之后调用的onNext是不输出的 因为已经提交过了
subscriber.onCompleted();
subscriber.onNext("4");
Log.e("被观察者","线程:"+Thread.currentThread().getName());
}
});
// subscribe():订阅关系
// subscribeOn():给被观察者指定线程
// observeOn():给观察者指定线程
//建立订阅关系 被观察者(生产者)订阅观察者/要求观察者观察等一系列操作
//如果观察者没有指定线程 就跟随被观察者订阅的线程 而观察者指定了线程 被观察者还是跟随自己的线程 跟被观察者没有关系
//现在是在主线程发生订阅关系
observable.subscribe(observer);
}
}
(双方没有指定线程)订阅关系在主线程: 双方都走在主线程里
2.
(双方没有指定线程)订阅关系在子线程:双方都走在子线程里
//在子线程里发生订阅关系
new Thread() {
@Override
public void run() {
super.run();
observable.subscribe(observer);
}
}.start();
3.
可以看到 就算订阅关系在子线程,但如果给被观察者指定了线程 还是会根据指定的线程走
并且 如果观察者没有指定线程 会根据被观察者指定的线程走
可以理解为 小偷去哪 警察就跟他去哪
//在子线程发生订阅关系 但是:
//被观察者:指定了线程
new Thread() {
@Override
public void run() {
super.run();
//给被观察者指定线程 observable.subscribeOn(AndroidSchedulers.mainThread()).subscribe(observer);
}
}.start();
4.
如果给观察者指定了线程 被观察者不会跟着观察者的线程走 还是会根据在订阅关系在哪个线程就跟哪个线程走
理解为小偷不会跟着警察走
//给观察者指定主线程
new Thread() {
@Override
public void run() {
super.run();
//给观察者指定线程 observable.observeOn(AndroidSchedulers.mainThread()).subscribe(observer);
}
}.start();
测试结束!!!
一般标准是这样写 观察者主线程更新Ui,被观察者子线程 生成数据 耗时操作
new Thread() {
@Override
public void run() {
super.run();
//Schedulers.io(): 子线程 I/O 操作(读写文件、读写数据库、网络信息交互等)
//观察者指定主线程 更新ui //被观察者指定子线程 //订阅
observable.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(observer);
}
}.start();
搞清了它们之间的线程关系 才能灵活使用
总结 :
1.(双方没有指定线程的情况下): 订阅关系在哪个线程,双方就会在哪个线程走
2.(被观察者指定了线程,观察者没有指定线程): 观察者就会跟着被观察者的线程走 {理解为警察跟着小偷走}
3.(被观察者没有指定线程,观察者指定了线程): 被观察者不会跟着观察者的线程走 这时候订阅关系在哪个线程 被观察者就走在哪个线程 {理解为小偷不会跟着警察走}
4.(双方都指定了线程): 双方根据双方各指定的线程走
详情看: