Retrofit2.0, использующий с rxjava, будет дорогостоящим отражением в потоке mian, даже используя subseOn()

Модифицированный интерфейс, возвращающий наблюдаемый

interface WeatherApi {
  companion object {
      val HOST = "https://api.heweather.com/x3/"
      val KEY = "41054a8f1d1a4ac992b1683e47a50146"
  }

  @GET("weather")
  fun getWeather(@Query("city") city: String, @Query("key") key: String) : Observable<Weather>
}

RestApi:

class RestApi {
var weatherApi: WeatherApi
init {
    val logInterceptor = HttpLoggingInterceptor()
    logInterceptor.level = HttpLoggingInterceptor.Level.BODY
    val okClient = OkHttpClient.Builder()
            .addInterceptor(logInterceptor)
            .retryOnConnectionFailure(true)
            .connectTimeout(15, TimeUnit.SECONDS)
            .build()
    val retrofit = Retrofit.Builder()
            .baseUrl(WeatherApi.HOST)
            .addConverterFactory(JacksonConverterFactory.create(ObjectMapper().registerModule(KotlinModule())))
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .client(okClient)
            .build()

    weatherApi = retrofit.create(WeatherApi::class.java)
}

fun getWeatherData(city: String, key: String): Observable<Weather> {
    return weatherApi.getWeather(city, key)  
}

Пожарный код:

restApi.getWeatherData("Qingdao", WeatherApi.KEY)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe { t -> helloText?.text = t.data.first().basic.city }

Когда я в первый раз вызываю firecode, мне понадобится 3 секунды, чтобы сделать отражение в основном потоке, я запутался, потому что я использовал подписку (Schedulers.io()).

У меня недостаточно репутации, чтобы опубликовать изображение, см. Изображение трассы в ссылках ниже http://ww2.sinaimg.cn/large/83f914a2jw1f6sn10bt2gj218g0p0qio.jpg

Когда я изменю интерфейс Retrofit, чтобы он возвращал "Call" и упаковывал ответ с помощью Observable в RestApi, все будет правильно.

Модифицированный интерфейс, который возвращает вызов

interface WeatherApi {
companion object {
    val HOST = "https://api.heweather.com/x3/"
    val KEY = "41054a8f1d1a4ac992b1683e47a50146"
}

@GET("weather")
fun getWeather(@Query("city") city: String, @Query("key") key: String) : Call<Weather>

}

Создайте Observable самостоятельно в RestApi:

fun getWeatherData(city: String, key: String): Observable<Weather> {
    return Observable.fromCallable { weatherApi.getWeather("qingdao",WeatherApi.KEY).execute().body() }
}

Затем вызовите код пожара, все дорогостоящие вещи будут выполнены в потоке Schedulers.io ().

У меня недостаточно репутации, чтобы опубликовать изображение, см. Изображение трассы в ссылках ниже http://ww2.sinaimg.cn/large/83f914a2jw1f6smyi73xnj218g0p0dpk.jpg

Мой вопрос:

Это глючит?

Почему прямой возврат Observable вызовет эту ошибку?

Или что я делаю не так с Retrofit?

0 ответов

Другие вопросы по тегам