函数返回null

时间:2019-04-26 08:40:54

标签: android kotlin retrofit2

此函数从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
}

那是什么问题?

1 个答案:

答案 0 :(得分:0)

  

它首先在logcate Log.d(“ data”,“ Here”)中显示

call.enqueue是一个异步调用,这意味着它不会在主线程上运行,这就是您首先获得Log.d("data", "Here")的原因。

这是您返回 null 的原因

如果您是异步使用此方法或在某些服务中使用该方法,并且想要同步执行,请使用call.execute,但这仅在与主线程不同的其他线程中使用时才有效,因为不允许进行网络操作在主线程上,在这种情况下,此方法将不会返回 null

您应该使用实时数据界面进行回调以接收WeatherModel。