【问题标题】:How to gey body() response using RxJava in Android如何在 Android 中使用 RxJava 获取 body() 响应
【发布时间】:2019-03-27 22:45:48
【问题描述】:

我是 Kotlin 的新手,我正在制作一种方法来调用 Endpoints 的接口并使用其中的一种方法。我在响应中使用Observable<> 而不是Call<>。我想知道如何在上面的“结果”中获取响应 body()。这是我的方法

 private fun refreshUser(userLogin: String) {
        executor.execute {
            // Check if user was fetched recently
            val userExists = userDao.hasUser(userLogin, getMaxRefreshTime(Date())) != null
            // If user have to be updated
            if (!userExists) {

                disposable = endpoints.getUser(userLogin)
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(
                                { result -> /*Get the response body() HERE*/},
                                { error -> Log.e("ERROR", error.message) }
                        )

            }
        }
    }

【问题讨论】:

    标签: android kotlin retrofit rx-java2


    【解决方案1】:

    这完全取决于您如何定义Retrofit 接口。为了获得Response,您需要从界面返回如下内容:

    fun getUsers() : Observable<Response<User>>

    然后在{ result -> /*Get the response body() HERE*/} 中,您将获得Response<User> 形式的内容,其中包含响应的正文。

    还需要注意的是,如果您利用Room 进行dao 交互,则无需将executor 括起来;它有 RxJava 支持。您可以使用 RxJava 运算符将 dao 查找与服务器调用结合起来。

    【讨论】:

    • 我的接口端点中有那个返回类型。所以我想知道在 ( result -> ) 里面放什么来获取正文,你能展示一个代码示例吗? @Emmanuel
    • result 是传入 lambda 的对象;在这种情况下,Response<> 实例。 result.body() 应该做你想做的事。
    【解决方案2】:

    查看本教程

    https://medium.freecodecamp.org/rxandroid-and-kotlin-part-1-f0382dc26ed8

    //Kotlin
    Observable.just("Hello World")
              .subscribeOn(Schedulers.newThread()) 
              //each subscription is going to be on a new thread.
              .observeOn(AndroidSchedulers.mainThread())) 
              //observation on the main thread
              //Now our subscriber!
              .subscribe(object:Subscriber<String>(){
                override fun onCompleted() {
                 //Completed
                }
    
                override fun onError(e: Throwable?) {
                 //TODO : Handle error here
                }
    
                override fun onNext(t: String?) {
                 Log.e("Output",t);
                }
               })
    

    如果你想使用改造 2 和 rxjava 2

    https://medium.com/@elye.project/kotlin-and-retrofit-2-tutorial-with-working-codes-333a4422a890

    interface WikiApiService {
    
        @GET("api.php")
        fun hitCountCheck(@Query("action") action: String,
                          @Query("format") format: String,
                          @Query("list") list: String,
                          @Query("srsearch") srsearch: String): 
                      Observable<Model.Result>
    
    }
    

    Observable 是类响应。

    private fun beginSearch(srsearch: String) {
      disposable = 
         wikiApiServe.hitCountCheck("query", "json", "search", srsearch)
          .subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(
           { result -> showResult(result.query.searchinfo.totalhits) },
           { error -> showError(error.message) }
          )
    }
    

    【讨论】:

    • 他专门询问改造
    • 我要使用改造
    【解决方案3】:

    如果正如您对@Emmanuel 所提到的,您的getUser() 方法的返回类型是Observable&lt;Response&lt;User&gt;&gt;,那么调用result.body() 将产生结果User

    { result ->
        val user: User = result.body()
    }
    

    但是,如果您正在寻找原始响应,则可以改为致电 result.raw().body();这将返回一个okhttp3.ResponseBody 类型。

    { result ->
        val body: ResponseBody = result.raw().body()
        val text: String = body.string()
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-11
      • 2019-11-03
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 2016-02-19
      • 2018-02-27
      • 2023-04-01
      相关资源
      最近更新 更多