Rxjava 2,高级安卓面试题及答案2024

本文深入解析了RxJava2中Observable#subscribeOn(Scheduler)的工作原理,通过源码分析展示了如何通过scheduleDirect方法和Worker线程来控制订阅操作的执行线程。文章还探讨了为何只有第一次subscribeOn设置有效,并提供了示例代码进行说明。
摘要由CSDN通过智能技术生成

NEW_THREAD = RxJavaPlugins.initNewThreadScheduler(new NewThreadTask());

static final class NewThreadTask implements Callable {

@Override

public Scheduler call() throws Exception {

return NewThreadHolder.DEFAULT;

}

}

static final class NewThreadHolder {

static final Scheduler DEFAULT = new NewThreadScheduler();

}

public static Scheduler io() {

return RxJavaPlugins.onIoScheduler(IO);

}

IO = RxJavaPlugins.initIoScheduler(new IOTask());

static final class IOTask implements Callable {

@Override

public Scheduler call() throws Exception {

return IoHolder.DEFAULT;

}

}

static final class IoHolder {

static final Scheduler DEFAULT = new IoScheduler();

}

static final class IoHolder {

static final Scheduler DEFAULT = new IoScheduler();

}

我们再回到 ObservableSubscribeOn 的 subscribeActual 方法,在上一篇博客的时候已经讲解 Observable 和 Observer 之间是怎样实现订阅关系的,这里就不再具体展开了。

接下来,我们重点关注这一行代码

parent.setDisposable(scheduler.scheduleDirect(new SubscribeTask(parent)));

我们先来看一下 SubscribeTask 这个类,他是 ObservableSubscribeOn 的一个非静态内部类,可以看到 其实也比较简单,他实现了 Runnable 接口,并且持有 parent 引用。

final class SubscribeTask implements Runnable {

private final SubscribeOnObserver parent;

SubscribeTask(SubscribeOnObserver parent) {

this.parent = parent;

}

@Override

public void run() {

source.subscribe(parent);

}

}

然后在 run 方法中,通过 source.subscribe(parent) 建立联系。因而,当我们的 SubscribeTask 的 run 方法运行在哪个线程,相应的 observer 的 subscribe 方法就运行在哪个线程。

这里可能会有人有疑问,SubscribeTask 没有 source 属性,它是怎么访问到 ObservableSubscribeOn 的属性的。

我们知道 java 中,非静态内部类默认持有外部类的引用ÿ

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值