如何观察java rx中的调用线程?
有无论如何告诉java rx使用observeOn函数中的当前线程? 我正在编写android syncadapter的代码,我希望在同步适配器线程中观察结果,而不是在主线程中观察结果。
使用Retrofit + RX Java的网络调用示例如下所示:
MyRetrofitApi.getInstance().getObjects()
.subscribeOn(Schedulers.io())
.observeOn(<current_thread>)
.subscribe(new Subscriber<Object>() {
//do stuff on the sync adapter thread
}
我尝试使用
...
.observeOn(AndroidSchedulers.handlerThread(new Handler(Looper.myLooper())))
...
这与android rx为主线程创建调度程序的方式相同,但只要我将Looper.myLooper()
替换为Looper.getMainLooper()
,就不再工作。
我可以使用Schedulers.newThread(),但作为其复杂的同步代码与大量的服务器调用,我会不断创建一个新的线程来发起新的网络调用,再次创建新的线程来发起更多的网络调用。 有没有办法做到这一点? 或者我的方法本身完全错误?
尝试使用Schedulers.immediate()
MyRetrofitApi.getInstance().getObjects()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.immediate())
.subscribe(new Subscriber<Object>() {
//do stuff on the sync adapter thread
}
它的描述如下: Creates and returns a Scheduler that executes work immediately on the current thread.
注意:
我认为保留SyncAdapter线程上的所有工作是可以的,因为它已经使用了不同的线程
哦,我刚刚在维基上找到了这个:https://github.com/ReactiveX/RxAndroid#observing-on-arbitrary-threads
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
}
链接地址: http://www.djcxy.com/p/88955.html
上一篇: How to observeOn the calling thread in java rx?
下一篇: Custom filter vs filter function in controller performance comparison