使用泛型的super和 extends的区别。
使用泛型的存取原则
如果你想从一个数据类型中获取数据,就使用? extends X。因为在存的时候,无法确定添加的具体是哪个子类。但是在取的时候,我们能确定肯定是X或是其子类。
如果想把数据写入一个数据结构中,就使用? super X。因为在取的时候,不能确定到底超类是什么。?就是父类。但是在存的时候,我们能确定肯定能存入X及其它的子类。
如果想同时存和取,就不使用泛型。
一、观察订阅的简单流程(1)
使用Observable有两个创建对象的方法,create()和subscribe()。
在create()中创建被观察的对象,也就是想要完成的任务,在subscrible()中创建具体的完成任务的对象。
在subscrible()方法中会执行OnSubscrible对象的call方法,并且将Subscrible对象传递过去,然后在call()中执行subscrible().onNext()
二、观察订阅的简单流程(2)
最初仍然是在create()创建了观察者Observable对象,但是在map()方法中重新创建了一个Observable对象,因此在subscrible()虽然内部调用了onSubscrible.call()方法,但是和上面的相比,observable对象改变了。因此并不是直接调用截图上的OnSubscrible()的call()方法。
而是调用了重新创建的Observable对象的OnSubscribleLift对象的call()。
在新创建的Observable对象中传入了最初的OnSubscrible对象引用。然后在call()方法中调用这个对象引用的call()方法。
开始回调到subscrible.onNext()
注意这个时候的subscrible对象并不是在主页面subscrible对象,而事在map中创建的MapSubscrible对象。这时候调用这个对象的onNext()。
在这里的transform就是在首页中的创建的func1对象,然后调用call(),这样就执行了首页的call里面的方法
并且执行完毕后紧接着执行actual.onNext()的方法,最终是调用了
这样就执行完毕整个步骤。
也就是说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()那么就会影响下一步执行的代码。