Rx java 如何在java rx中观察调用线程?
是否有任何方法可以告诉JavaRx在observeOn函数中使用当前线程?我正在为android syncadapter编写代码,我希望在同步适配器线程中观察结果,而不是在主线程中 改型+RX Java的网络调用示例如下所示: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
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
}