首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rxjava和Retrofit

使用Rxjava和Retrofit
EN

Stack Overflow用户
提问于 2017-09-11 12:24:22
回答 2查看 1.2K关注 0票数 0

我用的是Rxjava和Retrofit。我知道如何使用它,但我仍然不清楚“Rxjava对Retrofit到底做了什么”

我们对REST调用使用任何转换器(如Gson)和Okhttp库进行改造,一旦得到响应,它就具有可观察的类型(如果使用Rxjava,否则它将是调用类型)。现在的问题是,如果我们已经得到响应,那么Rxjava究竟是如何处理这个响应的呢?

到目前为止,通过查看代码,Rxjava首先采用了可观测响应,然后使用操作符对进行了一些操作,已经得到了响应,然后它只将最后的响应发送给观察者,从那里可以将数据膨胀成视图。

  1. 首先,如果我对Rxjava的理解是错误的,请告诉我。
  2. 进行操作的必要性是什么,因为我们已经使用API查询对数据进行了改进,从而获得了数据
  3. 为什么我们在Rxjava中使用客户接口对象?因此,我们使用它来代替观察者onNext()
  4. Rxjava是否也有助于检索目的,还是只对已经获得的数据进行操作?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-11 12:28:09

RXJava正在帮助您进行线程处理,并将其转换为现有的反应性代码。

它使用可流动/可观测/单机来获取数据(例如,如果您在流中有很多数据),它允许您使用可流动的背压。

它还允许您使用基本的反应性内容,比如将请求放在不同的线程中,然后再进行观察。

这也意味着您可以将结果/请求作为反应流并映射/转换/.和任何可能的与RxJava。

您不必担心它是现有数据的包装器,因为数据是在拦截器中获取并转换为与RxJava一起使用的。

您不会遇到任何性能问题,也不会有任何问题,因为社区对它进行了很好的测试。

1)首先,如果我对Rxjava的理解是错误的,请告诉我。

RxJava代表反应性开发.它使用了一种常见的基于函数编程的“编码风格”。

2)对已经获得的数据进行操作的必要性是什么,因为我们已经使用API查询对数据进行了改进

您可能希望只对一个响应进行多个操作。这意味着您可以将其转换为不同的“行为”,或者只需再次合并/连接/压缩/筛选。在某些情况下,您无法控制api并需要稍后处理它,这意味着反应性可以帮助您完成此任务。

*3)为什么在Rxjava中使用客户接口对象?因此,我们使用它来代替观察者或onNext()。*

因为您请求数据,所以需要使用它。这就像有了一个列表,并且您想要修改列表中的条目,它允许您在消费(输出)之前这样做。如果发生错误,也会有使用者。

4) Rxjava是否也有助于检索目的,还是只对已经获得的数据进行操作?

因为它是一个拦截器,所以它将“现有”数据转换为一个反应流。它对已经得到的数据进行操作。至少在这种情况下。

示例(Kotlin):

代码语言:javascript
复制
    var service = Retrofit.Builder()
            .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.newThread()))
            .addCallAdapterFactory(ObserveOnMainCallAdapterFactory(AndroidSchedulers.mainThread()))
            .addConverterFactory(GsonConverterFactory.create(GsonUtil.gson()))
            .client(okHttpClient)
            .baseUrl(host!!)
            .build()
            .create(YourService::class.java)

service.getLotsOfData()
       .flatMapIterable{ it }
       .flatMap{ it.id = id+"whatEverModified" }
       .subscribeOn(Schedulers.io)
       .observeOn(AndroidSchedulers.mainThread())

 interface YourService { @GET("lots/of/data") fun getLotsOfData(): Flowable<CustomModel> }

示例(Java):

代码语言:javascript
复制
 YourService service = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(GsonUtil.gson()))
            .client(okHttpClient)
            .baseUrl(host)
            .build()
            .create(YourService.class);

service.getLotsOfData()
       .flatMapIterable(data -> data)
       .flatMap( data -> { data = data +"whatEverModified"; return data; })
       .subscribeOn(Schedulers.io)
       .observeOn(AndroidSchedulers.mainThread());

 interface YourService { @GET("lots/of/data") Flowable<CustomModel> getLotsOfData();  }

此代码获取数据列表,可遍历每一项,将"whatEverModified“附加到模型中的每个id,并在item中完成所有工作。在修改和获取所有数据之后,它将返回主线程中的数据。订阅=处理数据,观察=消耗的数据。

票数 2
EN

Stack Overflow用户

发布于 2017-09-11 22:21:22

为了说明为什么您应该将RxJava与Retrofit一起使用,我将向您介绍a previous answer of mine。建立重组是一次性的成本(无论是在设计还是在运行时),但是简洁和可组合的好处永远都会得到回报。

请注意,我认为您在错误的抽象级别上查看了RxJava --不要从观察者-订阅者事件的角度来考虑;更多地考虑使用惰性/可重复操作的数据存储级别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46155738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档