Kotlin:等待异步调用完成,然后为 var 赋值,然后返回它

Aks*_*hay 4 android kotlin

我有一个变量loginToken。我想将值赋值为

var loginToken: String = getLoginToken()
Run Code Online (Sandbox Code Playgroud)

以下是我的getLoginToken功能

private fun getLoginToken(context: Context): String {
    val sharedPref: SharedPreferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE)
    var token =  sharedPref.getString("token", null)
    if (token == null) {
        token = LoginManager(activity).getToken(onGetSuccess = {
                // I get token here, i want to assign it to token var
             }, onGetFailure = {
                // I want to set token as empty string
             })
    }
    return token
}
Run Code Online (Sandbox Code Playgroud)

token当我得到 getToken 调用的结果时,我应该如何赋值并最终返回它?

mom*_*t99 5

您可以使用suspendCancellableCoroutine将回调方法转换为协程。因此,对于协程方法,我们可以这样做:

private fun getLoginToken(context: Context): String {
    val sharedPref: SharedPreferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE)
    var token = sharedPref.getString("token", null)
    if (token == null) {
        token = runBlocking { getTokenFromActivity(activity) }
    }
    return token
}

private suspend fun getTokenFromActivity(activity: Activity) =
    suspendCancellableCoroutine {
            LoginManager(activity).getToken(onGetSuccess = {
                it.completeResume(result)
            }, onGetFailure = {
                it.completeResume("")
            })
        }
Run Code Online (Sandbox Code Playgroud)

您还可以使用锁定方法。例如,使用CountdownLatch. (在函数之前锁定它getToken,并在回调中结果准备好时解锁。)