此函数从API获取数据。 我不了解其过程。
这里是问题,
它先返回 weatherModel ,然后再执行 onResponse 。
首先在日志类别 Log.d(“ data”,“ Here”)中显示
我的功能
fun get(city: String?): WeatherModel? {
var weatherModel: WeatherModel? = WeatherModel()
val retrofit =
retrofit2.Retrofit.Builder().baseUrl(Util.BASE_URL).addConverterFactory(GsonConverterFactory.create())
.build()
val service = retrofit.create(WeatherInterface::class.java)
val call = service.searchCity(city!!, "metric", "789af9673b393eb97f2acdea022f2005")
call.enqueue(object : Callback<WeatherModel> {
override fun onFailure(call: Call<WeatherModel>, t: Throwable) {
Log.d("data", "error ${t.message}")
}
override fun onResponse(call: Call<WeatherModel>, response: Response<WeatherModel>) {
Log.d("data", "success ${response.body()!!.weather!!.size}")
weatherModel = response.body()
data!!.getDataTrigger(weatherModel!!)
}
})
Log.d("data", "Here")
return weatherModel
}
那是什么问题?
答案 0 :(得分:0)
它首先在logcate Log.d(“ data”,“ Here”)中显示
call.enqueue
是一个异步调用,这意味着它不会在主线程上运行,这就是您首先获得Log.d("data", "Here")
的原因。
这是您返回 null 的原因
如果您是异步使用此方法或在某些服务中使用该方法,并且想要同步执行,请使用call.execute
,但这仅在与主线程不同的其他线程中使用时才有效,因为不允许进行网络操作在主线程上,在这种情况下,此方法将不会返回 null 。
您应该使用实时数据或界面进行回调以接收WeatherModel。