当前位置: 首页 > 知识库问答 >
问题:

Android上rxjava的默认调度程序

田骁
2023-03-14

我正在使用改型为我的异步网络调用返回rxjava Observable。

我发现自己重复以下调用:

someApiCall()。subscribeOn(Schedulers.io())。observeOn(AndroidSchedulers.mainThread())

似乎我总是在IO线程上订阅,在Android主线程上观察。这似乎是我找到的所有资源都提倡的最佳实践。也许除了长时间运行的计算之外,我不太明白我们什么时候会想要偏离这种模式。

有没有办法通过默认subscribeOn和observeOn线程来删除这个样板文件?

这是rxjava插件的用例吗?(我找不到很多使用它们的示例。)

我可以通过修改执行器来设置网络边界上的默认线程吗?

共有3个答案

唐和洽
2023-03-14

是的,可以删除两个调用。

这是改造适配器类,它自动调度订阅观察以消除每次调用中对样板调用的需要:

public class RxThreadingCallAdapterFactory extends CallAdapter.Factory {
    private final RxJava2CallAdapterFactory original;

    private RxThreadingCallAdapterFactory() {
        // Always call on background thread
        original = RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io());
    }

    public static CallAdapter.Factory create() {
        return new RxThreadingCallAdapterFactory();
    }

    @Override
    public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
        return new RxCallAdapterWrapper(original.get(returnType, annotations, retrofit));
    }

    private static class RxCallAdapterWrapper implements CallAdapter<Observable<?>> {
        private final CallAdapter<?> wrapped;

        public RxCallAdapterWrapper(CallAdapter<?> wrapped) {
            this.wrapped = wrapped;
        }

        @Override
        public Type responseType() {
            return wrapped.responseType();
        }

        @Override
        public <R> Observable<?> adapt(Call<R> call) {
            Observable observable = (Observable) wrapped.adapt(call);

            // Always handle result on main thread
            return observable.observeOn(AndroidSchedulers.mainThread());
        }
    }
}

然后在配置改装时使用此适配器:

Retrofit.Builder()
    .baseUrl(...)
    .addCallAdapterFactory(RxThreadingCallAdapterFactory.create())

我写了这篇博文,详细介绍了这里到底发生了什么。

这将删除这两个调用,我将其视为样板。我认为Jake将后台调用链接在一起的场景实际上并不适用,因为在这种情况下,我将对同步调用进行改造,而根本不使用调度器。

艾学海
2023-03-14

Retrofit Version 2.0.0-beta2 (2015-09-28)的更改日志显示在后台运行时需要订阅()。

修复:请求的可观察和基于单一的执行现在表现为同步(因此需要在后台运行SubbeOn())。

庄元龙
2023-03-14

对于可观察的响应,Reformation当前将subscribeOn设置为RestAdapter(提供或默认)的HTTP执行器。这样做是为了将RxJava支持填充到现有行为中。

2.0的计划是提供显式设置订阅和观测默认值的能力(无论是同时设置、仅设置一个或两者都不设置)。

例如,您不希望始终观察主线程的一个原因是,如果您需要将多个API调用链接在一起。

 类似资料:
  • 问题内容: 我正在使用Retrofit为异步网络调用返回rxjava Observable。 我发现自己在重复以下调用: 似乎我一直在订阅IO线程,并在Android主线程上进行观察。这似乎是我发现的所有资源都倡导的最佳实践。也许除了长时间运行的计算外,我不太了解何时要偏离此模式。 有没有一种方法可以通过默认subscriptionOn和observeOn线程来删除此样板? 这是rxjava插件的

  • 我的理解是,旨在并发运行其参数,并且当协同程序执行等待表达式时,它为事件循环提供了安排其他任务的机会。考虑到这一点,我惊讶地发现下面的代码片段忽略了的一个输入。 据我所知,会发生以下事情: run(main())对事件循环执行任何必要的全局初始化,并安排main()执行。 实际上,这不是我观察到的。相反,整个程序相当于。我发现非常有趣的是,即使是代码的微小变化似乎也会重新引入公平。例如,如果我们有

  • 我们有一个使用Spring Framework在Tomcat中运行的Web应用程序。我们需要为循环操作添加一些计划作业。为此,我们遇到了Quartz Scheduler,并遵循了使用Quartz with Spring配置作业的教程,并按预期计划并运行了作业。 所以我们有一些任务是在应用程序启动时安排的。现在我们希望用户手动运行作业并更改作业的触发器,但是我们需要将这些更改持久化到数据库中。因此,

  • 在RxJava中,有5种不同的调度程序可供选择: > immediate():创建并返回在当前线程上立即执行工作的调度程序。 trampoline():创建并返回一个调度程序,该调度程序将当前线程上的工作排队,以便在当前工作完成后执行。 newThread():创建并返回一个调度程序,该调度程序为每个工作单元创建一个新线程。 计算():创建并返回一个用于计算工作的调度程序。这可以用于事件循环、处理

  • 问题内容: 在Akka文档中指出,如果未配置调度程序,则将使用默认调度程序。默认调度程序的属性是什么,即并行度最小值,并行度因子,并行度最大值等? 问题答案: 默认情况下,提供的调度程序是带有的调度程序,并且默认的并行度值为: 最小并行度: 8 并行因子: 3.0 最大并行度: 64 您可以在文档中看到所有这些信息。 有一个节名为: 参考配置清单 这是配置文件的相关部分(我只删除了注释):

  • 我必须根据传入的请求写入文件。由于多个请求可能同时出现,我不希望多个线程试图一起覆盖文件内容,这可能会导致丢失一些数据。 因此,我尝试使用实例变量PublishSubject收集所有请求的数据。我在初始化期间订阅了publishSubject,此订阅将在应用程序的整个生命周期内保持不变。此外,我还在一个单独的线程(由Vertx事件循环提供)上观察到相同的实例,该线程调用负责编写文件的方法。 稍后在