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

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

甘兴学
2023-03-14

是否有无论如何告诉java rx在观察函数中使用当前线程?我正在为android sync适配器编写代码,我希望在同步适配器线程中而不是在主线程中观察结果。

使用Retrofit RXJava的示例网络调用如下所示:

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()用于活套。getMainLooper()。

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

共有2个答案

黄彬
2023-03-14

哦,我刚在维基上找到这个:https://github.com/ReactiveX/RxAndroid#observing-在任意线程上

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

    }
狄凯
2023-03-14

尝试使用调度程序。立即()

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

}

它的描述是:创建并返回一个调度程序,该调度程序立即在当前线程上执行工作。

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

 类似资料:
  • 我正在进行一个项目,我们在该项目中遇到了线程问题。有一个问题使线程终止,并且线程无法自动重新启动,因此我们想更改当前的实现。我们想出了一个想法来运行一个观察者线程来管理文件处理线程。 请有人建议如何制作监视程序状态的线程以及如何执行此操作的想法。 编辑:所以基本上这就是发生的事情。用户上载一些写入文件共享的媒体文件。移动服务中运行的线程扫描媒体文件并附加到电子邮件。在此过程中,线程终止,无法将媒体

  • 我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular

  • 问题内容: 一个人如何监视/触发一条路线上的事件? 问题答案: 以下事件也可用(它们的回调函数采用不同的参数): $ routeChangeSuccess $ routeChangeError $ routeUpdate-如果将reloadOnSearch属性设置为false

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 问题内容: 我对RxJava(和一般的Reactive范式)很陌生,所以请多多包涵。 假设我有这个和这个嵌套的数据结构: 并假设我有以下API端点: 现在,让我们假设: ** 现在,如果有的话,如何递归所有子项评论?即获得ID为[1,2,3,4,5,6]的评论? ** 我已经搜索并偶然发现了这个:https : //jkschneider.github.io/blog/2014/recursive

  • 我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法