使用Rxjava和Retrofit

时间:2017-09-11 12:24:23

标签: android retrofit rx-java

我正在使用Rxjava和Retrofit。我知道如何使用它,但我仍然不清楚“Rxjava与Retrofit完全相同”

我们使用任何转换器(如Gson)和Okhttp库进行REST API调用的改造,一旦得到响应,它就是Observable类型(如果使用Rxjava,否则它将是CALL类型)。现在问题是,如果我们已经得到了Rxjava对该响应的确切反应吗?

到目前为止,通过查看代码,Rxjava首先采用 Observable响应并使用运算符对该执行某些操作已经得到回应然后它只是将最终回复发送到观察者,从那里可以将数据扩展到视图中。

  1. 首先启发我,如果我对我的理解错了 Rxjava。
  2. 已获得数据进行操作的需求是什么,因为我们已经使用改造使用API​​查询过滤了数据
  3. 为什么我们在Rxjava中使用Customer接口对象?所以我们在观察者 onNext()的地方使用它。
  4. Rxjava是否也有助于检索目的,或者只是对已经获得的数据进行操作?

2 个答案:

答案 0 :(得分:2)

RXJava正在帮助您进行线程化并转换为现有的反应代码。

它使用Flowable / Observable / Single来获取您的数据(例如,如果您在Stream中有许多数据),它允许您使用Flowable进行背压。

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

这也意味着您可以将结果/请求作为反应流和map / convert / ...以及RxJava的任何可能。

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

您不会遇到任何性能问题或存在任何问题,因为它已经过社区的充分测试。

1)首先,如果我对Rxjava有所了解,我是否错了。

RxJava代表反应性发展。它使用了一种常见的编码风格"这是基于函数式编程。

2)对已经获得的数据进行操作的需求是什么,因为我们已经使用改造使用API​​查询过滤了数据

您可能希望仅对一个响应进行多项操作。这意味着您可以将其转换为不同的行为"或者再次合并/ concat / zip / filter。在某些情况下,您无法控制api并需要稍后处理它,这意味着被动可以帮助您完成此任务。

* 3)为什么我们在Rxjava中使用Customer接口对象?所以我们在Observer或onNext()的位置使用它。 *

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

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

因为它是一个拦截器,它会转换现有的#34;将数据转换为反应流。 它根据已经获得的数据进行操作。至少在这种情况下。

示例(Kotlin):

    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):

 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();  }

此代码获取您的数据列表,可遍历每个项目,追加&#34; whatEverModified&#34;到模型中的每个id,并在IO Thread中完成所有工作。修改并获取所有数据后,它将返回主线程中的数据。订阅=处理数据,观察=消费数据。

答案 1 :(得分:1)

为什么你应该使用RxJava和Retrofit,我会指向你a previous answer of mine。设置Retrofit是一次性成本(无论是在设计上还是在运行时),但简洁性和可组合性的好处将永远带来回报。

请注意,我认为您在错误的抽象级别上查看RxJava - 不要考虑Observer-Subscriber-Event;在懒惰/可重复操作的数据流级别上多考虑一下。