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

理解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 Consumersuper T> onNext;

    CreateEmitter(Consumersuper 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(Consumersuper 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

你可能感兴趣的:(android开发历)