Kotlin Coroutines, retrofit-2.6.1, Сетевой ответ null - PullRequest
0 голосов
/ 29 октября 2019

Я прохожу учебник по reso-кодеру Weather app. Большинство вещей изменилось с течением времени, так же как и веб-сайт погоды apixu. Теперь настало время Retrofit 2.6.1, что означает kotlin coroutinesПроблема в том, что я получаю все Null в сети ОтветЯ прошел все классы данных с SerializedName, все кажется довольно хорошо, все еще не могу получить проблему .. Кстати, я не использую ViewModel прямо сейчас, просто прыгаю в фрагмент textView

interface ApixuWeatherApiService {


 @GET("current")
    suspend fun getCurrentWeather(
        @Query("query") location: String,
        @Query("lang") languageCode: String = "en"
    ): CurrentWeatherResponse

    //to handle this above interface we need companion object

    companion object WeatherAPis {
        private val requestInterceptor = Interceptor { chain ->
            val url = chain.request()
                .url().newBuilder().addQueryParameter("access_key", API_KEY)
                .build()

            val request = chain.request().newBuilder().url(url).build()
            chain.proceed(request)
        }
        private val okHTTPClient = OkHttpClient.Builder().addInterceptor(requestInterceptor).build()
        private fun retroFit(): Retrofit = Retrofit
            .Builder()
            .client(okHTTPClient)
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        val weatherApi: ApixuWeatherApiService =
            retroFit().create(ApixuWeatherApiService::class.java)
    }
}

Класс фрагмента


class CurrentWeatherFragment : Fragment() {


    private lateinit var viewModel: CurrentWeatherViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.current_weather_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(CurrentWeatherViewModel::class.java)
        CoroutineScope(IO).launch {
            widCOntext()
        }

    }


    private suspend fun widCOntext() {
        val apiService = ApixuWeatherApiService.weatherApi
            withContext(Main) {
                val currentWeatherResponse =
                    withContext(IO) {
                        apiService.getCurrentWeather(
                            "London"
                        )
                    }
                txtView.text = currentWeatherResponse.toString()
            }

    }
}

Я использовал плагин для преобразования JSON в файл kotlin, чтобы получитьэти Четыре класса данных Текущий

data class Current(
    @SerializedName("observation_time")
    val observationTime: String,
    val temperature: Int,
    @SerializedName("weather_code")
    val weatherCode: Int,
    @SerializedName("weather_icons")
    val weatherIcons: List<String>,
    @SerializedName("weather_descriptions")
    val weatherDescriptions: List<String>,
    @SerializedName("wind_speed")
    val windSpeed: Int,
    @SerializedName("wind_degree")
    val windDegree: Int,
    @SerializedName("wind_dir")
    val windDir: String,
    val pressure: Int,
    val precip: Int,
    val humidity: Int,
    val cloudcover: Int,
    val feelslike: Int,
    @SerializedName("uv_index")
    val uvIndex: Int,
    val visibility: Int,
    @SerializedName("is_day")
    val isDay: String
)

CurrentWeatherResponse

data class CurrentWeatherResponse(
    val request: Request,
    val location: Location,
    val current: Current
)

Местоположение

data class Location(
    val name: String,
    val country: String,
    val region: String,
    val lat: String,
    val lon: String,
    @SerializedName("timezone_id")
    val timezoneId: String,
    val localtime: String,
    @SerializedName("localtime_epoch")
    val localtimeEpoch: Int,
    @SerializedName("utc_offset")
    val utcOffset: String
)

Запрос

data class Request(
    val type: String,
    val query: String,
    val language: String,
    val unit: String
)
...