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?