主要结合https://www.imooc.com/article/68834这篇来学习的,先提一下观察者模式的一个别名,就是:发布-订阅模式。
在RxJava中有3种角色:
* Observable (被观察者)
* Observer /Subscriber (观察者/订阅者)
* Event (事件)
被观察者 Observables可以发出一系列的事件
,发出的事件可以是诸多不同的场景,比如发送网络请求、执行数据库操作、文件操作,一个for循环等等。 然后当事件执行结束后,交给 Observer/Subscriber 的回调处理。一言以蔽之,被观察者一个一个事件发出来,然后 观察者/订阅者 收到,就是RxJava。 若事件从Observable产生,直到Observer/Subscriber 接收不需要其他处理,那么流程为: Obsevable -> Subscriber。主流程为以下三步:
事件的产生发送:
Observable发出一系列的事件
创建一个ObservableObservable observable = Observable.create(new Observable.OnSubscribe() { @Override
public void call(Subscriber super String> subscriber) { // 发送一个 Hello World 事件
subscriber.onNext("Hello World!"); // 事件发送完成
subscriber.onCompleted();
}
这段代码可以理解为, Observable 发出了一个类型为 String ,值为 “Hello World!” 的事件,仅此而已。
作者:哈士奇WWW
链接:https://www.imooc.com/article/68834
来源:慕课网
观察者/订阅者接送数据:
比如常见的Rxbus,在活动中扮演订阅/观察者的监听Subscription,就是如下代码同样功能的部分:
// 创建一个ObserverObserver observer = new Observer() { @Override
public void onCompleted() {
Log.i(TAG, "complete");
} @Override
public void onError(Throwable e) {
} @Override
public void onNext(String s) {
Log.i(TAG, s);
}
};
或者
// 创建一个SubscriberSubscriber subscriber = new Subscriber() { @Override
public void onCompleted() {
Log.i(TAG, "complete");
} @Override
public void onError(Throwable e) {
} @Override
public void onNext(String s) {
Log.i(TAG, s);
}
};
Observer 是观察者, Subscriber 也是观察者,Subscriber 是一个实现了Observer接口的抽象类,对 Observer 进行了部分扩展,在使用上基本没有区别;
Subscriber 多了发送之前调用的 onStart() 和解除订阅关系的 unsubscribe() 方法。
并且,在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用。所以在这之后的示例代码,都使用 Subscriber 来作为观察者。
作者:哈士奇WWW
链接:https://www.imooc.com/article/68834
来源:慕课网
事件的订阅:
最后,我们可以调用 subscribe 操作符, 进行事件订阅。
// 订阅事件observable.subscribe(subscriber);
在 Subscriber 实现的三个方法中,顾名思义,对应三种不同状态:
1. onComplete(): 事件全部处理完成后回调
2. onError(Throwable t): 事件处理异常回调
3. onNext(T t): 每接收到一个事件,回调一次
作者:哈士奇WWW
链接:https://www.imooc.com/article/68834
来源:慕课网
=========================================================
rxjava线程切换调度:
可以通过 subscribeOn()
和 observeOn()
这两个方法来进行线程调度:
依然还是显示一张图片,不同的是,这次是从网络上加载图片
final ImageView ivLogo = (ImageView) findViewById(R.id.ivLogo);
Observable.create(new Observable.OnSubscribe() { @Override
public void call(Subscriber super Drawable> subscriber) { try {
Drawable drawable = Drawable.createFromStream(new URL("https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=2502144641,437990411&fm=80&w=179&h=119&img.JPEG").openStream(), "src");
subscriber.onNext(drawable);
} catch (IOException e) {
subscriber.onError(e);
}
}
}) // 指定 subscribe() 所在的线程,也就是上面call()方法调用的线程
.subscribeOn(Schedulers.io()) // 指定 Subscriber 回调方法所在的线程,也就是onCompleted, onError, onNext回调的线程
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber() { @Override
public void onCompleted() {
} @Override
public void onError(Throwable e) {
Log.e(TAG, e.toString());
} @Override
public void onNext(Drawable drawable) {
ivLogo.setImageDrawable(drawable);
}
});
所以,这段代码就做一件事,在 io 线程加载一张网络图片,加载完毕之后在主线程中显示到ImageView上。
作者:哈士奇WWW
链接:https://www.imooc.com/article/68834
来源:慕课网
在比如发送http请求部分的核心代码:
//Rxjava 实现发协议
Subscription subscription = observable.subscribeOn(Schedulers.io()) //在IO线程进行网络请求
.observeOn(AndroidSchedulers.mainThread()) //回主线程去处理请求结果
.subscribe(callback);
Observable.from 的用法:
Observable.from 接收一个集合作为事件集,然后每次依次一个一个事件发送给给subscriber。下面以kotlin的代码举例:
package com.example.kotlindemo1
import android.databinding.DataBindingUtil
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.kotlindemo1.databinding.ActivityMainBinding
import rx.Observable
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding:ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)
binding.txtShow.text = "hello,kotlin"
Observable.from( intArrayOf(1, 2, 3).asIterable())
.subscribe {
Log.d("tag",it.toString())
}
}
}
结果为1,2,3 ,依次日志打印出来了:
03-20 21:00:38.986 19024-19024/com.example.kotlindemo1 D/tag: 1
03-20 21:00:38.986 19024-19024/com.example.kotlindemo1 D/tag: 2
03-20 21:00:38.986 19024-19024/com.example.kotlindemo1 D/tag: 3
03-20 21:00:39.053 19024-19268/com.example.kotlindemo1 I/Adreno-EGL: : EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013_msm8974_refs/tags/AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013__release_AU (I48a9d37399)
OpenGL ES Shader Compiler Version: E031.29.00.00