Rx java 如何在java rx中观察调用线程?

Rx java 如何在java rx中观察调用线程?,rx-java,android-syncadapter,rx-android,Rx Java,Android Syncadapter,Rx Android,是否有任何方法可以告诉JavaRx在observeOn函数中使用当前线程?我正在为android syncadapter编写代码,我希望在同步适配器线程中观察结果,而不是在主线程中 改型+RX Java的网络调用示例如下所示: MyRetrofitApi.getInstance().getObjects() .subscribeOn(Schedulers.io()) .observeOn(<current_thread>) .subscribe(new Subscriber<O

是否有任何方法可以告诉JavaRx在observeOn函数中使用当前线程?我正在为android syncadapter编写代码,我希望在同步适配器线程中观察结果,而不是在主线程中

改型+RX Java的网络调用示例如下所示:

MyRetrofitApi.getInstance().getObjects()
.subscribeOn(Schedulers.io())
.observeOn(<current_thread>)
.subscribe(new Subscriber<Object>() {
    //do stuff on the sync adapter thread

}
这与android rx为主线程创建调度程序的方式相同,但只要我将
Looper.myLooper()
替换为
Looper.getMainLooper()
,调度程序就不再工作了


我可以使用Schedulers.newThread(),但由于其复杂的代码与大量服务器调用同步,我会不断创建一个新线程,以触发新的网络调用,从而再次创建新线程以启动更多的网络调用。有办法做到这一点吗?还是我的方法本身完全错了?

哦,我刚刚在维基上找到了这个:

我认为这也适用于你的情况——当然,除了创建一个新线程之外。。。所以只要:

final Handler handler = new Handler(); // bound to this thread
MyRetrofitApi.getInstance().getObjects()
    .subscribeOn(Schedulers.io())
    .observeOn(HandlerScheduler.from(handler))
    .subscribe(new Subscriber<Object>() {
        //do stuff on the sync adapter thread

    }
final Handler=new Handler();//绑定到此线程
MyAPI.getInstance().getObjects()
.subscribeOn(Schedulers.io())
.observeOn(HandlerScheduler.from(handler))
.subscribe(新订户(){
//在同步适配器线程上执行操作
}

尝试使用
调度程序.immediate()

myAPI.getInstance().getObjects()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.immediate())
.subscribe(新订户(){
//在同步适配器线程上执行操作
}
它的描述是:
创建并返回一个调度器,该调度器在当前线程上立即执行工作。

注意:

我认为保留SyncAdapter线程上的所有工作是可以的,因为它已经在使用不同的线程了

这有点推测性,所以我不会将此作为一个答案发布:从版本2.0-beta2开始,改型不再将网络请求放在不同的线程上-请参阅此处:如果您使用的是当前版本的改型yo你应该能够完全跳过订阅和观察,一直保持同步适配器线程。或者我误解了你的问题,你确实想创建新线程,但它们都应该返回到你开始的线程?你解决了吗?谢谢你的快速回复。我升级了rx android(我使用了旧版本)并尝试了该示例。不幸的是,它不起作用,但我创建了一些测试,发现调用了onNext(),但订阅者没有收到它。只有在最后添加Looper.loop()之后,它才似乎起作用(这是一个处理消息的infite循环)。即使是完全相同的示例也告诉我,在创建处理程序之前,我需要使用Looper.prepare()。可能我做了一些根本错误的事情,或者可能是android rx本身的问题?恐怕我无法告诉您这里出了什么问题…让我们看看其他人有什么要说的…@tiqz
发现了onNext()的错误被调用,但订阅者没有收到它
onNext是订阅者的方法,因此您编写的内容对我来说有点奇怪。理论上,david的回答应该可以。我建议您发布更详细的内容,以便我们能够帮助您。Schedulers.immediate()我不工作。我需要在GlThread上观察,但它在subscribeOn的线程上观察。原因可能是什么?@DmitriyPuchkov您的
subscribeOn
observeOn
函数的顺序是什么?顺序与您编写的相同。我通过创建自定义执行器来解决我的问题,该执行器将可运行的内容发布到GlThread。@DmitriyPuchkov您的
GLThread
是当前的吗?我编写的解决方案对我有效。RxJava2上没有Scheduler.immediate(),有什么新的吗?
new Thread(new Runnable() {
    @Override
    public void run() {
        final Handler handler = new Handler(); // bound to this thread
        Observable.just("one", "two", "three", "four", "five")
                .subscribeOn(Schedulers.newThread())
                .observeOn(HandlerScheduler.from(handler))
                .subscribe(/* an Observer */)

        // perform work, ...
    }
}, "custom-thread-1").start();
final Handler handler = new Handler(); // bound to this thread
MyRetrofitApi.getInstance().getObjects()
    .subscribeOn(Schedulers.io())
    .observeOn(HandlerScheduler.from(handler))
    .subscribe(new Subscriber<Object>() {
        //do stuff on the sync adapter thread

    }
MyRetrofitApi.getInstance().getObjects()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.immediate())
.subscribe(new Subscriber<Object>() {
    //do stuff on the sync adapter thread

}