android进阶:理解RxJava2的调用原理

来源:互联网 发布:plsql随机抽取数据 编辑:程序博客网 时间:2024/06/05 21:16

理解rxjava2的调用原理,当然是从最简单的入手,先分析无线程切换。
一般的RxJava使用如同下面的这仲形式,是不是感觉很牛逼呢?

Observable.create(new ObservableOnSubscribe<String>() {    @Override    public void subscribe(ObservableEmitter<String> e) throws Exception {        for (int i = 0;i < 10;i++) {            e.onNext(String.valueOf(++count));        }    }}).subscribe(new Consumer<String>() {    @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<String>() {    @Override    public void subscribe(ObservableEmitter<String> e) throws Exception {        for (int i = 0;i < 10;i++) {            e.onNext(String.valueOf(++count));        }    }})

1.第一件:把Observable自己给创建出来(为了不相互干扰)
1.第二件:把ObservableOnSubscribe用一个标量保存起来,因为他是厂家,但是暂时还没有人可以消费
然后到执行:这里也是做了两件事情。

subscribe(new Consumer<String>() {    @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<T> createEmitter = new CreateEmitter<>(onNext);        try {            source.subscribe(createEmitter);        } catch (Exception e) {            e.printStackTrace();        }    }

启动: 下面的是部分代码,感觉看不懂可以结合下面所有的代码来理解

@Override    public void subscribe(ObservableEmitter<String> 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<T> {    void accept(@NonNull T t) throws Exception;}

ObservableEmitter.java

interface ObservableEmitter<T> {    void onNext(T value);}

ObservableOnSubscribe.java

interface ObservableOnSubscribe<T> {    void subscribe(ObservableEmitter<T> 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<String>() {                    @Override                    public void subscribe(ObservableEmitter<String> e) throws Exception {                        for (int i = 0;i < 10;i++) {                            e.onNext(String.valueOf(++count));                        }                    }                }).subscribe(new Consumer<String>() {                    @Override                    public void accept(@NonNull String s) throws Exception {                        msgTv.setText(s);                    }                });            }        });    }}

不想copy的话,下面是代码下载:
http://download.csdn.net/detail/a756213932/9890791