【问题标题】:Unable to run on Ui thread- from Retrofit无法在 Ui 线程上运行 - 来自 Retrofit
【发布时间】: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


【解决方案1】:

您可以将其与协程一起使用,如下所示

suspend fun checklogin(username: String,password: String):Boolean{
      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 response = service.login("oman123",username , password)
//hope response body is not null
if (response.isSuccessful) {
     returningval = true
}
return returningval
}

和登录api

suspend fun login(parameters): Response<JsonObject>

调用checklogin函数为

fun callCheckLogin(username: String,password: String){
  withContext(Dispatchers.IO){
    val returningBool = checklogin(userName, password)
    //if want to use this val in main thread use withContext(Dispatchers.Main) below this line
  }
}

【讨论】:

  • 我没有运行这段代码。如果有语法错误请解决。
猜你喜欢
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
相关资源
最近更新 更多