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
- android进阶:理解RxJava2的调用原理
- Android进阶:RxJava2
- Android RxJava2的更新
- 【Android进阶】Android调用WebService的实现
- 从零开始的RxJava之旅(3)---- RxJava进阶RxJava2
- Android Rxjava2
- c#调用c的dll原理理解
- 【Java进阶】对Java中的传值调用的理解
- Android中rxjava2的基本使用
- Android RxJava2.0的简单使用
- RXJAVA2引用理解
- RxJava2线程切换原理
- 【Android进阶】Android程序与JavaScript之间的简单调用
- 源码分析Rxjava2是如何完成链式调用的
- View的进阶理解
- Java进阶--深入理解ArrayList实现原理
- android-进阶(2)-JSON的一些理解
- 【Android - 进阶】之图片三级缓存的原理及实现
- 软件测试方法------可以分为手工测试和自动化测试
- 笔记1--html基础知识
- 有关于office 2007 word和mathtpye 6.9之间容易报错的问题
- Subsequence HDU
- google 和 unixlite 的设计理念
- android进阶:理解RxJava2的调用原理
- 【Spring】Spring配置数据源的常用方式
- jira+Confluence Wiki安装
- 调通sina33m下的AP6212A0版本(分色排版)V1.0版本
- android stuido view视图可视化错误
- 微信JSSDK接口,previewImage
- 七牛python sdk 上传报SSL: CERTIFICATE_VERIFY_FAILED]
- 文章标题
- 股市K线图指标算法的代码实现(二)