理解rxjava2的调用原理,当然是从最简单的入手,先分析无线程切换。
一般的RxJava使用如同下面的这仲形式,是不是感觉很牛逼呢?
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
for (int i = 0;i < 10;i++) {
e.onNext(String.valueOf(++count));
}
}
}).subscribe(new Consumer() {
@Override
public void accept(@NonNull String s) throws Exception {
msgTv.setText(s);
}
});
学习过RxJava的同学肯定会产生一个疑问,这到底是如何实现的呢?
事不宜迟,现在带领大家去实现上面的调用!!!
RxJava的调用关系就像有三个角色,1、超市A(Observable),2、厂家B(ObservableOnSubscribe),3、消费者C(Consumer)。
厂家生产了东西,一般是不会直接把东西卖给消费者的,消费者也一般不去厂家直接买东西的,所以就需要超市的出现来协调他们两者的关系。
正如RxJava,Observable这个东西经常被比喻为水管也就是这个道理(连接上和下)。
那么是如何调用的呢:
其实Observable在执行下面的代码的时候首先干了两件事情
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
for (int i = 0;i < 10;i++) {
e.onNext(String.valueOf(++count));
}
}
})
1.第一件:把Observable自己给创建出来(为了不相互干扰)
1.第二件:把ObservableOnSubscribe用一个标量保存起来,因为他是厂家,但是暂时还没有人可以消费
然后到执行:这里也是做了两件事情。
subscribe(new Consumer() {
@Override
public void accept(@NonNull String s) throws Exception {
msgTv.setText(s);
}
});
2.第一件:把Consumer转换为ObservableEmitter
2.第二件:把转换得到的ObservableEmitter与1.的ObservableOnSubscribe连接起来,这个过程就是订阅。也就会调用下面,就开始启动了~~~
订阅过程:
void subscribe(Consumer super T> onNext) {
CreateEmitter createEmitter = new CreateEmitter<>(onNext);
try {
source.subscribe(createEmitter);
} catch (Exception e) {
e.printStackTrace();
}
}
启动: 下面的是部分代码,感觉看不懂可以结合下面所有的代码来理解
@Override
public void subscribe(ObservableEmitter e) throws Exception {
for (int i = 0;i < 10;i++) {
e.onNext(String.valueOf(++count));
}
}
上面的ObservableEmitter就是Consumer转换过来的,onNext()是Consumer.accept()的包装:
public void onNext(T t) {
try {
onNext.accept(t);
} catch (Exception e) {
e.printStackTrace();
}
}
所以呢!调用e.onNext(),实际上就是执行Consumer.accept()的代码,是不是好神奇呢哈哈!!!
下面是代码的所有类,一共五个,还不简洁来怼我:
Consumer.java
interface Consumer {
void accept(@NonNull T t) throws Exception;
}
ObservableEmitter.java
interface ObservableEmitter {
void onNext(T value);
}
ObservableOnSubscribe.java
interface ObservableOnSubscribe<T> {
void subscribe(ObservableEmitter e) throws Exception;
}
CreateEmitter.java
final class CreateEmitter<T> implements ObservableEmitter<T>{
private final Consumer super T> onNext;
CreateEmitter(Consumer super T> onNext) {
this.onNext = onNext;
}
@Override
public void onNext(T t) {
try {
onNext.accept(t);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Observable.java
class Observable<T> {
private final ObservableOnSubscribe<T> source;
static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
return new Observable<>(source);
}
private Observable(ObservableOnSubscribe<T> source) {
this.source = source;
}
void subscribe(Consumer super T> onNext) {
CreateEmitter<T> createEmitter = new CreateEmitter<>(onNext);
try {
source.subscribe(createEmitter);
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试类:MainActivity.java
public class MainActivity extends AppCompatActivity {
int count = 0;
TextView msgTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
msgTv = (TextView) findViewById(R.id.msgTv);
findViewById(R.id.startBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
for (int i = 0;i < 10;i++) {
e.onNext(String.valueOf(++count));
}
}
}).subscribe(new Consumer() {
@Override
public void accept(@NonNull String s) throws Exception {
msgTv.setText(s);
}
});
}
});
}
}
不想copy的话,下面是代码下载:
http://download.csdn.net/detail/a756213932/9890791