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

链接改造服务,支持RxJava

穆华彩
2023-03-14

我在使用Reformation的RxJava支持链接观察对象时遇到了问题。我可能误解了如何使用它,否则它可能是改装中的一个bug。希望这里有人能帮我理解发生了什么事。编辑:我正在对这些响应使用MockRestaAdapter—这可能与RxSupport实现略有不同有关。

这是一个假的银行应用程序。它正在尝试进行传输,传输完成后,它应该执行帐户请求以更新帐户值。这基本上只是我试用flatMap的一个借口。很遗憾,以下代码不起作用,没有订阅服务器收到通知:

案例1:链接两个改造产生的可观测物

传输服务(注意:返回生成的可观察改装):

@FormUrlEncoded @POST("/user/transactions/")
public Observable<TransferResponse> transfer(@Field("session_id") String sessionId,
                                             @Field("from_account_number") String fromAccountNumber,
                                             @Field("to_account_number") String toAccountNumber,
                                             @Field("amount") String amount);

帐户服务(注意:返回改造生成的可观察对象):

@FormUrlEncoded @POST("/user/accounts")
public Observable<List<Account>> getAccounts(@Field("session_id") String sessionId);

将两个改造产生的可观测数据链接在一起:

transfersService.transfer(session.getSessionId(), fromAccountNumber, toAccountNumber, amount)
            .flatMap(new Func1<TransferResponse, Observable<? extends List<Account>>>() {
                @Override public Observable<? extends List<Account>> call(TransferResponse transferResponse) {
                    return accountsService.getAccounts(session.getSessionId());
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());

案例2:创建我自己的可观察对象,并与改造产生的对象链接

如果我忽略了对“平面映射”调用的内置Rx支持改装,那么它将完美工作!所有订阅者都会得到通知。见下文:

新账户服务(注:不产生可观察的):

@FormUrlEncoded @POST("/user/accounts")
public List<Account> getAccountsBlocking(@Field("session_id") String sessionId);

创建我自己的可观察对象,并自己发出项目:

transfersService.transfer(session.getSessionId(), fromAccountNumber, toAccountNumber, amount)
            .flatMap(new Func1<TransferResponse, Observable<? extends List<Account>>>() {
                @Override public Observable<? extends List<Account>> call(TransferResponse transferResponse) {
                    return Observable.create(new Observable.OnSubscribe<List<Account>>() {
                        @Override public void call(Subscriber<? super List<Account>> subscriber) {
                            List<Account> accounts = accountsService.getAccountsBlocking(session.getSessionId());
                            subscriber.onNext(accounts);
                            subscriber.onCompleted();
                        }
                    });
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());

任何帮助都将不胜感激!

共有1个答案

阎咏思
2023-03-14

答案是肯定的,您应该能够从改装中链接观察结果。mockrestapter$MockRxSupport:createMockObservable私有类中似乎有一个bug。调度是关于订阅订阅者订阅可观察对象的,这种方式似乎是错误的。HttpExecutor线程本身启动之后,就开始订阅可观察对象。我相信最初的流程来自您的调度程序。io()线程在mockHandler之前完成并取消订阅。可以订阅invokeSync返回的Observable。如果您查看改装模拟模块中的代码,希望此解释有一定的意义。

作为当前代码的一种变通方法,在使用改装模拟时,您可以使用自己的即时执行器实现替换内部默认执行器。这将允许至少在测试模拟时具有由调度器提供的单线程流。io。

// ImmediateExecutor.java
public class ImmediateExecutor implements Executor {
    @Override
    public void execute(Runnable command) {
        command.run();
    }
}

// Create your RestAdapter with your ImmdiateExecutor
RestAdapter adapter = new RestAdapter.Builder()
            .setEndpoint(endpoint)
            .setExecutors(new ImmediateExecutor(), null)
            .build();

至于从源头解决问题,您还可以在项目中包含改造模拟项目作为源,并使用下面的代码修改MockRestAdapter$MockRxSupport: createMockWatable方法。我已经测试了您的用例,它确实解决了问题。

---MockRestapter。java$MockRxSupport----

Observable createMockObservable(final MockHandler mockHandler, final RestMethodInfo methodInfo,
        final RequestInterceptor interceptor, final Object[] args) {
      return Observable.create(new Observable.OnSubscribe<Object>() {
        @Override public void call(final Subscriber<? super Object> subscriber) {
          try {
            if (subscriber.isUnsubscribed()) return;
            Observable observable =
                (Observable) mockHandler.invokeSync(methodInfo, interceptor, args);

            observable.subscribeOn(Schedulers.from(httpExecutor));

            //noinspection unchecked
            observable.subscribe(subscriber);

          } catch (RetrofitError e) {
            subscriber.onError(errorHandler.handleError(e));
          } catch (Throwable e) {
            subscriber.onError(e);
          }
        }
      });
    }

在这里创建了一个改装项目的问题,我们将看看他们是否接受它。

 类似资料:
  • 所以基本上我想做的是,打第一个网络电话。如果调用的RESTful web服务返回1,则进行第二次网络调用。如果web服务返回0,则不要进行第二次网络调用。 这是我的密码 显然,上面的代码是错误的,因为它应该总是返回可观察的。那么,如果第一次网络调用返回0,我的代码应该如何编写?

  • 我目前正在开发一个支持保活连接的多线程代理服务器。在处理来自火狐浏览器的请求时,我看到了一些奇怪的问题。我使用localhost:10001/http://url连接到我的本地代理,我可以访问这个主机上的所有链接。过程如下。1.创建一个套接字,将其绑定到端口10001 2.接受连接,如果客户端连接了fork()3.继续将客户端请求处理为持久连接。 现在的问题是,当我在Firefox中打开一个新选项

  • 我读到的一切都说,冲刺重用服务器与传递JSON的客户端进行通信。如果客户端传递了 XML,并且响应具有接受 =xml,该怎么办?然后它会使用 XML 进行通信吗? 还是仅是 JSON?

  • 本文向大家介绍Dubbo支持服务降级吗?相关面试题,主要包含被问及Dubbo支持服务降级吗?时的应答技巧和注意事项,需要的朋友参考一下 Dubbo 2.2.0 以上版本支持。  

  • 我的Spring Boot初始化遇到了麻烦。我在一个简单的Spring Boot项目中有这个结构。

  • 本文列出了Apache HTTP服务器中所有的可执行程序。 索引 httpd Apache超文本传输协议服务器 apachectl Apache HTTP服务器控制接口 ab Apache HTTP服务器性能测试工具 apxs APache功能扩展工具 configure 配置源代码树 dbmmanage 建立和更新DBM形式的基本认证文件 htcacheclean 清理磁盘缓冲区 htdiges