【发布时间】:2020-04-17 22:32:41
【问题描述】:
我正在尝试从改造调用方法中更新我的布尔标志,但该标志始终返回 false,尽管标志从一个块执行为 true。请让我知道如何更新标志,有什么问题。我如何在 kotlin 中使用 courines。请帮帮我。
下面是我的代码
fun checklogin(username: String,password: String):Boolean {
Log.i("##check-coming here","ll")
var returningval=false
val interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
val client = OkHttpClient.Builder().addInterceptor(interceptor).build()
val retrofit = Retrofit.Builder()
.baseUrl(AllConstants.MAIN_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build()
val service =
retrofit.create(RetrofitInterface::class.java)
val call = service.login("oman123",username , password)
call.enqueue(object : Callback<JsonObject> {
override fun onResponse(
call: Call<JsonObject>,
response: Response<JsonObject>
) {
try {
if (response.code()==200)
{
val obj = response.body()?.get("success")?.asJsonObject
jsonvalue=obj
returningval=true
Log.i("##check-coming here","rescode1"+returningval)
}
else if (response.code()==404)
{
errorcode=404
returningval=false
Log.i("##check-coming here","rescode2"+returningval)
}
}
catch (e: Exception) {
errorcode=505
returningval=false
Log.i("##check-coming here","rescode3"+returningval)
}
}
override fun onFailure(
call: Call<JsonObject>,
t: Throwable
) {
errorcode=606
returningval=false
Log.i("##check-coming here","rescode4"+returningval)
}
})
return returningval
}
如上所述,您可以看到返回值标志始终返回 false,尽管该语句是正确的,使用 runonuithread 或 courines 是最好的方法。请帮我写代码sn-p。
您的帮助将不胜感激。提前致谢
【问题讨论】:
-
runOnUiThread可能不是一个好主意。如果您使用 RxJava 或 Courontines,您可以订阅响应,实际上是subscribeOn(AndroidSchedulars.mainThread())。如果您有兴趣,我可以添加更多代码。 -
call.enqueue 是一个异步函数,因此您的方法将返回值而无需等待响应。因此,在您的情况下,在您设置值之前返回返回值。
-
@MaryamMirzayee 是的,请。帮我写 couroutines 的代码
-
@AmitTiwary 他在
onResponse中发布了returnval,所以它会在收到回调时执行 -
@AmitTiwary 所说的是正确的。在异步或不同线程操作的情况下,使用回调来获得正确的响应/结果,而不是方法返回类型。
标签: android kotlin retrofit retrofit2 kotlin-coroutines