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

我如何自定义自己的可观察对象?

孙鑫鹏
2023-03-14

我正在使用reverfit2、rxjava2和adapter-rxjava来实现我的http api调用。

//API definition
Observable<String> queryProducts(@Body Query query);

//API implementation.
serviceApi.queryProducts(query)
                .subscribeOn(new Scheduler().ioThread())
                .observeOn(new Scheduler().mainThread())
                .subscribe(new Observer());

如果我有很多api需要实现,并且每个单独的api实现都需要添加这两行:

.subscribeOn(new Scheduler().ioThread())
.observeOn(new Scheduler().mainThread())

我不想在每个api实现中添加它们。我想使用MyObservable作为api定义的结果类型。

我的想法如下所示:

//API definition
 MyObservable<String> queryProducts(@Body Query query);

//MyObservable definition
    public class MyObservable<T> extends Observable<T> {
        /**
         * Creates an Observable with a Function to execute when it is subscribed to.
         * <p>
         * <em>Note:</em> Use {@link #create(OnSubscribe)} to create an Observable, instead of this constructor,
         * unless you specifically have a need for inheritance.
         *
         * @param f {@link OnSubscribe} to be executed when {@link #subscribe(Subscriber)} is called
         */
        protected MyObservable(OnSubscribe<T> f) {
            super(f);
            this.subscribeOn(new Scheduler().ioThread());
            this.observeOn(new Scheduler().mainThread());
        }
    }

我在https://github.com/square/reverfit/blob/master/reverfit-adapters/rxjava/src/main/java/reverfit2/adapter/rxjava/rxjavaalladapterfactory.java上跟踪了rxjavacalladapterfactory.java代码。我在第100行发现了RxJavaCallAdapterFactory,它似乎只允许Observable类通过这个检查点。我无法扩展和重写这个方法,因为这个类是final类。

if (rawType != Observable.class && !isSingle && !isCompletable) {
      return null;
}

有没有办法在一个超级类中添加这两行,我不想在每个api实现中添加它们?非常感谢。

共有1个答案

贝嘉泽
2023-03-14

虽然在RxJava2中您可以安全地扩展Observable,但它不太可能适合这种情况,即您希望重用公共代码而不是复制公共代码(而是从头开始创建Observable,通常用于包装外部异步回调代码)。
相反,您可以使用compose()运算符来转换自定义代码中的Observable,这是将公共逻辑添加到Observable中的经典方法。
您可以根据Dan Lew的文章提供一个完全符合您需要的示例(添加调度器)。

重新分级Reverfit适配器,因为它正在创建带有反射的服务,它不能支持自定义类,但生成现有的RxJava类。
顺便说一句,您正在查看/使用带有RxJava2的Reverfit的RxJava1适配器,您需要切换到RxJava2适配器,带有RxJava2适配器,您可以看到实际上Reverfit使用它自己的自定义observable类。

如果使用compose()对您来说还不够(因为您仍然需要将它添加到每个API中),那么正式的方法是创建您自己的CallAdapter.Factory并通过包装RXJava2CallAdapterFactory委托Adapting,实现改版CallAdapter,然后用您的自定义代码/Operators/Schdeuler包装返回的Observable。请参阅本教程。或者在我正在处理的某个库中使用RxJava2的示例(相当相同)。

 类似资料:
  • 问题内容: 我正在阅读另一个SO问题,即Swift do-try-catch语法。在他的回答中, rickster 为OP的自定义类创建了扩展。 Konrad77 评论说,这是“保持代码整洁的好方法。” 我尊重他们的知识,这使我相信我在自己的代码中遗漏了一点。 除了为我创建的类创建扩展之外,还有其他好处(除了整洁)还是原因?我可以将相同的功能直接放入类中。如果我是唯一使用该类的人,或者其他人将使用

  • 好的,在laravel 4中,如果我想添加自己的自定义类,例如:库\myFunction.php然后我执行以下步骤: 添加myFunctions.php到app/库/myFunctiosn.php 在app/start/global.php,在ClassLoader::addDirectory(数组(,我添加app_path()。 为了在我的刀片视图中调用它,我添加了以下代码 它是有效的。 但是如

  • 问题内容: 我正在尝试使我的对象可包裹。但是,我有自定义对象,这些对象具有ArrayList我制作的其他自定义对象的属性。 最好的方法是什么? 问题答案: 您可以在此处,此处(在此处获取代码)和此处找到一些示例。 您可以为此创建一个POJO类,但是您需要添加一些额外的代码来实现它Parcelable。看一下实现。 创建此类后,您可以Intent像这样轻松地传递此类的对象,并在目标活动中恢复该对象。

  • 问题内容: 我有一个自定义类对象(下面是示例)。 使用:我想将所有子列表“合并”到一个大列表中。因此,我认为我需要使自定义类成为可迭代的。 这是我的自定义类的示例。 我实现了,但是似乎没有用。他们甚至没有被召集。 知道我做错了什么吗? 注意:使用Python 3.3 问题答案: 当您尝试遍历类实例时调用的是什么: 是在返回的对象上调用的内容(在python2.x上,不是,我一般都对它们都使用别名,

  • 我想创建我自己的地图减少工作。 map类的输出是:文本(键)、文本(值) reduce类的输出是:文本,不可扭曲 我试图通过以下方式实现它: 当我尝试运行它时,它会显示以下输出并终止 错误的课程从哪里来? 和 工作失败的原因 我不明白哪里出了问题。任何帮助

  • 问题内容: 我有以下代码: 当执行时返回: 我本来希望结果是1和true。为什么我的元素没有被认为是相同的,我该如何纠正?谢谢,韦恩。 问题答案: 您需要实现和每总承包合同MyElement。如果没有,将使用默认实现比较对象的内存地址。由于要在contains调用中创建MyElement的新实例,因此它会返回false。