使用泛型的super和 extends的区别。

使用泛型的存取原则

如果你想从一个数据类型中获取数据,就使用? extends X。因为在存的时候,无法确定添加的具体是哪个子类。但是在取的时候,我们能确定肯定是X或是其子类。

如果想把数据写入一个数据结构中,就使用? super X。因为在取的时候,不能确定到底超类是什么。?就是父类。但是在存的时候,我们能确定肯定能存入X及其它的子类。

如果想同时存和取,就不使用泛型。

 

一、观察订阅的简单流程(1)

使用Observable有两个创建对象的方法,create()和subscribe()。

在create()中创建被观察的对象,也就是想要完成的任务,在subscrible()中创建具体的完成任务的对象。

Rxjava1源码学习

在subscrible()方法中会执行OnSubscrible对象的call方法,并且将Subscrible对象传递过去,然后在call()中执行subscrible().onNext()

 

二、观察订阅的简单流程(2)

Rxjava1源码学习

最初仍然是在create()创建了观察者Observable对象,但是在map()方法中重新创建了一个Observable对象,因此在subscrible()虽然内部调用了onSubscrible.call()方法,但是和上面的相比,observable对象改变了。因此并不是直接调用截图上的OnSubscrible()的call()方法。

而是调用了重新创建的Observable对象的OnSubscribleLift对象的call()。

Rxjava1源码学习

在新创建的Observable对象中传入了最初的OnSubscrible对象引用。然后在call()方法中调用这个对象引用的call()方法。

Rxjava1源码学习

开始回调到subscrible.onNext()

Rxjava1源码学习

注意这个时候的subscrible对象并不是在主页面subscrible对象,而事在map中创建的MapSubscrible对象。这时候调用这个对象的onNext()。

Rxjava1源码学习

在这里的transform就是在首页中的创建的func1对象,然后调用call(),这样就执行了首页的call里面的方法

Rxjava1源码学习

并且执行完毕后紧接着执行actual.onNext()的方法,最终是调用了

Rxjava1源码学习

这样就执行完毕整个步骤。

Rxjava1源码学习

 

也就是说map就是将数据原材料进行加工的处理的过程。

https://blog.csdn.net/sqm8822/article/details/79142458

 

可以利用 subscribeOn() 结合 observeOn() 来实现线程控制,让事件的产生和消费发生在不同的线程。能不能多切换几次线程?

能。因为 observeOn() 指定的是 Subscriber 的线程,而这个 Subscriber 并不是(严格说应该为『不一定是』,但这里不妨理解为『不是』)subscribe() 参数中的 Subscriber ,而是 observeOn() 执行时的当前 Observable 所对应的 Subscriber ,即它的直接下级 Subscriber 。换句话说,observeOn() 指定的是它之后的操作所在的线程。因此如果有多次切换线程的需求,只要在每个想要切换线程的位置调用一次 observeOn() 即可。上代码:

Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定

    .subscribeOn(Schedulers.io())    //这个起作用,但是如果使用多次,那么后面的是没有作用的。

    .observeOn(Schedulers.newThread())

    .map(mapOperator) // 新线程,由 observeOn() 指定

    .observeOn(Schedulers.io())

    .map(mapOperator2) // IO 线程,由 observeOn() 指定

    .observeOn(AndroidSchedulers.mainThread)

    .subscribe(subscriber);  // Android 主线程,由 observeOn() 指定

 

使用subscribeOn()时,如果使用多次,那么只有第一次是有效果的。但是如果是使用observeOn()那么就会影响下一步执行的代码。

 

 

相关文章:

  • 2021-11-06
  • 2021-11-06
  • 2021-11-06
  • 2021-11-27
  • 2021-09-19
  • 2021-10-03
  • 2020-03-20
  • 2021-11-16
猜你喜欢
  • 2018-05-10
  • 2019-11-30
  • 2020-05-03
  • 2018-01-15
  • 2020-01-06
  • 2019-02-15
  • 2019-02-27
  • 2021-11-06
相关资源
相似解决方案