Как получить ответ body () с помощью RxJava в Android - PullRequest
0 голосов
/ 23 октября 2018

Я новичок в Kotlin, и я делаю метод, который делает вызов интерфейса конечных точек и использует один из методов, присутствующих там.Я использую 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) }
                        )

            }
        }
    }

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

См. Этот учебник

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>

}

Наблюдаемый ответ класса.

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) }
      )
}
0 голосов
/ 23 октября 2018

Если, как вы упомянули @Emmanuel, тип возврата вашего getUser() метода равен Observable<Response<User>>, то при вызове 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()
}
0 голосов
/ 23 октября 2018

Все зависит от того, как вы определили интерфейс Retrofit.Чтобы получить Response, вам нужно вернуть что-то из интерфейса, которое выглядит следующим образом:

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

Затем внутри { result -> /*Get the response body() HERE*/} вы получите что-то вроде Response<User>, который имеет тело ответа.

Также следует отметить, что вам не нужно заключать executor, если вы используете Room для взаимодействия dao;у него есть поддержка RxJava.Вы можете использовать операторы RxJava для объединения поиска dao с вызовом сервера.

...