RxJava线程调度浅析

一、结论

本身不从头介绍RxJava的用法,仅对RxJava的线程调度做出一点解说,为了节约阅读时间,先把本文得到的几条结论写到前面

  • 在不指定线程的情况下,RxJava遵循线程不变的原则,即:在哪个线程调用subscribe,就在哪个线程消费;在哪个线程生产事件,就在哪个线程消费事件;
  • observeOn可以调用多次,每次调用影响它直接的下级Subscriber;但是subscribeOn只能调用一次;
  • Schedulers.newThread每次都会创建一个新的线程来执行任务。
  • Schedulers.io(),有可能会造成内存溢出;它的原理是,当存在空闲线程时,就以先进后出的方式来查找空闲线程来执行当前任务;如果没有空闲线程,就再开启一个线程;RxJava默认会回收超过60S仍然空闲的线程池。

下面依次从实际使用和源码的角度对上述内容做出解释,涉及大量的源码阅读,慎读。

二、RxJava默认遵循线程不变的原则

在不指定线程的情况下,RxJava遵循线程不变的原则,即;在哪个线程调用subscribe,就在哪个线程消费;在哪个线程生产事件,就在哪个线程消费事件。

先看一个例子。

class MainActivity : AppCompatActivity() {
   
    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        object : Thread() {
   
            override fun run() {
   
                Log.e("yanlog","thread id:"+Thread.currentThread().name)
                testRxjava(1)
            }
        }.start()
    }

    /**
     * 我们每隔1S发射一个数据
     */
    private fun testRxjava(index: Int) {
   
        Observable.create<Int> {
   
            Log.e("yanlog", "Observable index:$index:" + Thread.currentThread().name)
            it.onNext(1)
            it.onComplete()
        }.subscribe({
   
            Log.e("yanlog", "Subscriber index$index:$it:" + Thread.currentThread().name)
        }, {
   })
    }
}

观察下输出

06-01 18:45:51.887 5436 5466 E yanlog : thread id:Thread-2
06-01 18:45:51.904 5436 5466 E yanlog : Observable index:1:Thread-2
06-01 18:45:51.904 5436 5466 E yanlog : Subscriber index1:1:Thread-2

然后更改下实现,我们让observable在IO线程触发

        Observable.create<Int> {
   
            Log.e("yanlog", "Observable index:$index:" + Thread.currentThread().name)
            it.onNext(1)
            it.onComplete()
        }.subscribeOn(Schedulers.io())
            .subscribe({
   
                Log.e("yanlog", "Subscriber index$index:$it:" + Thread.currentThread().name)
            }, {
   })

观察下输出

06-01 18:47:06.300 5857 5911 E yanlog : thread id:Thread-2
06-01 18:47:06.325 5857 5916 E yanlog : Observable index:1:RxCachedThreadScheduler-1
06-01 18:47:06.325 5857 5916 E yanlog : Subscriber index1:1:RxCachedThreadScheduler-1

从上述的两个例子我们可以得到结论

在不指定线程的情况下,RxJava遵循线程不变的原则,即;在哪个线程调用subscribe,就在哪个线程消费;在哪个线程生产事件,就在哪个线程消费事件。

为什么会这样呢? 请看下一章,observeOn与subscribeOn

三、observeOn与subscribeOn

我们先不用observeOn与subscribeOn,利用RxJava实现一个最简单的例子。

 Observable.create<Int> {
   
     Log.e("yanlog", "Observable index:$index:" + Thread.currentThread().name)
     it.onNext(1)
     it.onComplete()
 }.subscribe({
   
         Log.e("yanlog", "Subscriber index$index:$it:" + Thread.currentThread().name)
     }, {
   })

我们知道,一旦我们对Observable进行subscribe,Observable中的代码就会执行起来,具体怎么执行呢?

先看下相关源码

public static <

你可能感兴趣的:(Android,rxjava,kotlin,android)