Android subscribeOn主线程和observerOn调用线程RxJava2

Android subscribeOn主线程和observerOn调用线程RxJava2,android,rx-java2,Android,Rx Java2,我正在为一个非线程安全的库包装一个遗留代码。 当库的客户端从主线程调用API时,我需要切换到主线程,然后切换回调用线程以返回结果 我想我可以使用(这是针对Android的,但问题更一般) RxJava1是否有类似于Schedulers.immediate()的东西?我知道,对于测试,您可以用调度程序.immediate()替换调度程序.trampoline(),但是从文档和我运行的测试来看,它看起来像调度程序。trampoline()与调度程序.immediate()没有太多关系 有没有别的办法

我正在为一个非线程安全的库包装一个遗留代码。 当库的客户端从主线程调用API时,我需要切换到主线程,然后切换回调用线程以返回结果

我想我可以使用(这是针对Android的,但问题更一般)

RxJava1是否有类似于Schedulers.immediate()的东西?我知道,对于测试,您可以用
调度程序.immediate()
替换
调度程序.trampoline()
,但是从文档和我运行的测试来看,它看起来像
调度程序。trampoline()
调度程序.immediate()
没有太多关系 有没有别的办法呢

已添加

   /**
 * Returns a default, shared {@link Scheduler} instance whose {@link io.reactivex.Scheduler.Worker}
 * instances queue work and execute them in a FIFO manner on one of the participating threads.
 * <p>
 * The default implementation's {@link Scheduler#scheduleDirect(Runnable)} methods execute the tasks on the current thread
 * without any queueing and the timed overloads use blocking sleep as well.
 * <p>
 * Note that this scheduler can't be reliably used to return the execution of
 * tasks to the "main" thread. Such behavior requires a blocking-queueing scheduler currently not provided
 * by RxJava itself but may be found in external libraries.
 * <p>
 * This scheduler can't be overridden via an {@link RxJavaPlugins} method.
 * @return a {@link Scheduler} that queues work on the current thread
 */
/**
*返回其{@link io.reactivex.Scheduler.Worker}的默认共享{@link Scheduler}实例
*实例排队工作,并在其中一个参与线程上以FIFO方式执行它们。
*
*默认实现的{@link Scheduler#scheduleDirect(Runnable)}方法在当前线程上执行任务
*在没有任何排队和定时重载的情况下,也使用阻塞睡眠。
*
*请注意,此调度程序无法可靠地用于返回
*将任务发送到“主”线程。此类行为需要当前未提供的阻塞排队计划程序
*由RxJava本身提供,但可以在外部库中找到。
*
*无法通过{@link RxJavaPlugins}方法重写此计划程序。
*@返回队列在当前线程上工作的{@link Scheduler}
*/
这两部分是什么意思

  • 返回一个默认的共享{@link Scheduler}实例,其{@link io.reactivex.Scheduler.Worker}*实例排队工作并执行 在其中一个参与线程上以FIFO方式执行这些操作

  • @返回队列在当前线程上工作的{@link Scheduler}

立即
蹦床
调度程序不适合返回到特定线程。您需要一个单线程调度程序,可以从
ExecutorService
创建该调度程序:

ExecutorService exec=Executors.newSingleThreadedExecutor();
调度程序单线程=调度程序.from(exec);
Observable.fromCallable(()->api.init())
.subscribeOn(单线程)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(v->System.out.println(“已初始化”))
.observeOn(单线程)
.map(v->api.getData(v))
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(v->System.out.println(“某些数据:”)
.observeOn(单线程)
.doOnNext(v->api.close())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(v->System.out.println(“完成”))
;
//后来
exec.shutdown();
编辑:


不可能返回到任意线程。但是,如果一个线程有一个活套/处理器,那么您可以将其转换为一个带有AndroidScheduler的调度器,并通过
observeOn

将其作为目标,而
immediate
trampoline
调度器不适合返回到特定线程。您需要一个单线程调度程序,可以从
ExecutorService
创建该调度程序:

ExecutorService exec=Executors.newSingleThreadedExecutor();
调度程序单线程=调度程序.from(exec);
Observable.fromCallable(()->api.init())
.subscribeOn(单线程)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(v->System.out.println(“已初始化”))
.observeOn(单线程)
.map(v->api.getData(v))
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(v->System.out.println(“某些数据:”)
.observeOn(单线程)
.doOnNext(v->api.close())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(v->System.out.println(“完成”))
;
//后来
exec.shutdown();
编辑:


不可能返回到任意线程。但是,如果一个线程有一个活套/处理器,那么您可以将其转换为一个带有AndroidScheduler的调度程序,并通过
observeOn

将其作为目标。我的问题不同。我需要切换到一个线程(在我的示例中,我使用了主线程,但它可以是另一个线程),然后在调用方线程上观察到调用方决定使用的任何东西。如果该线程有一个循环器/处理程序,那么您可以将其转换为具有
AndroidSchedulers
的调度程序。好的。如果你加上这个作为回答,我会同意的。谢谢,我的问题不一样。我需要切换到一个线程(在我的示例中,我使用了主线程,但它可以是另一个线程),然后在调用方线程上观察到调用方决定使用的任何东西。如果该线程有一个循环器/处理程序,那么您可以将其转换为具有
AndroidSchedulers
的调度程序。好的。如果你加上这个作为回答,我会同意的。非常感谢。
   /**
 * Returns a default, shared {@link Scheduler} instance whose {@link io.reactivex.Scheduler.Worker}
 * instances queue work and execute them in a FIFO manner on one of the participating threads.
 * <p>
 * The default implementation's {@link Scheduler#scheduleDirect(Runnable)} methods execute the tasks on the current thread
 * without any queueing and the timed overloads use blocking sleep as well.
 * <p>
 * Note that this scheduler can't be reliably used to return the execution of
 * tasks to the "main" thread. Such behavior requires a blocking-queueing scheduler currently not provided
 * by RxJava itself but may be found in external libraries.
 * <p>
 * This scheduler can't be overridden via an {@link RxJavaPlugins} method.
 * @return a {@link Scheduler} that queues work on the current thread
 */