本文参考抛物线大佬的给 Android 开发者的 RxJava 详解
回调方法:可以看一下这个Android之回调函数 -
//安卓中常见的回调方法
Button bt_add = (Button) findViewById(R.id.bt_add);
bt_add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
onclick是回调方法,OnClickListener是回调接口
在Activity里监听Button的点击事件onclick
Rxjava的使用
- 异步可以理解为多个线程可以同时对一个对象进行操作,无需等待
- 同步就是线程不能同时对一个对象进行操作,需要等待
- Rxjava就是基于异步的
Observer(Subscriber):观察者
Observer 即观察者,它决定事件触发的时候将有怎样的行为。 RxJava 中的 Observer 接口的实现方式:
Observer observer = new Observer() {
@Override
public void onNext(String s) {
Log.d(tag, "Item: " + s);
}
@Override
public void onCompleted() {
Log.d(tag, "Completed!");
}
@Override
public void onError(Throwable e) {
Log.d(tag, "Error!");
}
};
除了 Observer 接口之外,RxJava 还内置了一个实现了 Observer 的抽象类:Subscriber。 Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:
Subscriber subscriber = new Subscriber() {
@Override
public void onNext(String s) {
Log.d(tag, "Item: " + s);
}
@Override
public void onCompleted() {
Log.d(tag, "Completed!");
}
@Override
public void onError(Throwable e) {
Log.d(tag, "Error!");
}
};
1.onStart(): 这是 Subscriber 增加的方法,它会在 subscribe 刚开始,而事件还未发送之前被调用,用来做一些准备工作,但是!!!这个不适用于显示进度条等UI线程操作
2.unsubscribe():用来取消订阅,要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用来解除引用关系
Observable:被观察者
Observable observable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Hi");
subscriber.onNext("Aloha");
subscriber.onCompleted();
}
});
Subscribe (订阅):
Observable.subscribe(Observable);//建立订阅关系
线程控制 —— Scheduler
在RxJava 中,Scheduler ——调度器,相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程。Android中常用的Scheduler有两个:
Schedulers.io():I/O 操作,耗时的线程
AndroidSchedulers.mainThread():主线程
subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
下面列个例子:
Observable observable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {//这里在IO线程操作
subscriber.onNext("Hello");
subscriber.onNext("Hi");
subscriber.onNext("Aloha");
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
.subscribe(new Action1() {
@Override
public void call(Integer number) {//回调到主线程,进行UI操作
Log.d(tag, "number:" + number);
}
});