0

我的项目有很多操作必须一个接一个地执行。我正在使用侦听器,但我在 Android 上找到了本教程 Kotlin coroutines,我想用可读性更好的代码更改我的服务器调用。但我想我错过了一些东西。下面的代码总是从getTime1()函数返回一个错误:

suspend fun getTimeFromServer1() :ResultServer<Long> {
        val userId = SharedPrefsHelper.getClientId()
        return withContext(Dispatchers.IO) {
            val call: Call<ResponseFromServer>? = userId?.let { apiInterface.getTime(it) }
            (call?.execute()?.body())?.run {
                val time:Long? = this.data?.time
                time?.let {
                    Timber.tag("xxx").e("time received it ${it}")// I am getting the right result here
                    ResultServer.Success(it)
                }
                Timber.tag("xxx").e("time received ${time}")
            }
            ResultServer.Error(Exception("Cannot get time"))
        }
    }


fun getTime1() {
        GlobalScope.launch {
            when (val expr: ResultServer<Long> = NetworkLayer.getTimeFromServer1()) {
                is ResultServer.Success<Long> -> Timber.tag("xxx").e("time is ${expr.data}")
                is ResultServer.Error -> Timber.tag("xxx").e("time Error") //I am always get here
            }}
    }
    }

但是,如果我使用侦听器 ( getTime()) 一切正常:

 suspend fun getTimeFromServer(savingFinishedListener: SavingFinishedListener<Long>) {
        val userId = SharedPrefsHelper.getClientId()
        withContext(Dispatchers.IO) {
            val call: Call<ResponseFromServer>? = userId?.let { apiInterface.getTime(it) }
            (call?.execute()?.body())?.run {
                val time:Long? = this.data?.time
                time?.let {
                    Timber.tag("xxx").e("time received it ${it}")
                    savingFinishedListener.onSuccess(it)
                }

            }
            savingFinishedListener.onSuccess(null)
        }
    }

   fun getTime() {
        GlobalScope.launch {
            NetworkLayer.getTimeFromServer(object:SavingFinishedListener<Long>{
                override fun onSuccess(t: Long?) {
                    t?.let {
                        Timber.tag("xxx").e("time here $it") //I am getting the right result
                    }
                }
            })
           }
        }

提前感谢您的帮助。

4

1 回答 1

1

lambda 的最后一行隐含地是该 lambda 的返回值。withContext由于您的lambda中没有任何明确的 return 语句,因此它的最后一行:

ResultServer.Error(Exception("Cannot get time"))

意味着它总是返回这个错误。你可以return@withContext在你ResultServer.Success(it)的前面加上那行代码也从 lambda 返回。

旁注:不要使用 GlobalScope

于 2021-01-29T19:25:24.183 回答