gpt4 book ai didi

android - 功能异常

转载 作者:行者123 更新时间:2023-12-02 13:30:42 25 4
gpt4 key购买 nike

我有一个奇怪的功能。最后我得到错误的答案,而最后我得到正确的答案。

fun Fragment.getAuthToken(): String? {
val am: AccountManager = AccountManager.get(activity)
val accounts: Array<out Account> = am.getAccountsByType(getAccountType())
var authToken: String? = null
if (accounts.isNotEmpty()) {
val account = accounts.first()
am.getAuthToken(
account,
getAuthTokenType(),
Bundle(),
activity,
{
// it: AccountManagerFuture<Bundle>
authToken = it.result.getString(AccountManager.KEY_AUTHTOKEN)
Timber.i("Here Auth token is $authToken") // shows correct authToken
},
Handler { true }
)
}
Timber.i("Auth token is $authToken") // shows null
return authToken
}
authToken在某处正确,但是我在函数末尾得到 null
我认为这与 AccountManagerFuture有关。该函数可能不会在返回 null之前等待。我该如何纠正。

我如何暂停执行,以便 authToken完成后返回 AccountManagerFuture

最佳答案

您找出正确的答案。您可以使用blockingGetAuthToken来获取结果。另外还有一个suspendCoroutine,您也可以使用AccountManager 的线程以挂起方式将结果返回主界面。像这样:

suspend fun Fragment.getAuthToken(): String? = suspendCoroutine { cont ->
val am: AccountManager = AccountManager.get(activity)
val accounts: Array<out Account> = am.getAccountsByType(getAccountType())

accounts.firstOrNull()?.let { account ->
am.getAuthToken(account, getAuthTokenType(), Bundle(), activity, {
it.result.getString(AccountManager.KEY_AUTHTOKEN).also { token ->
Timber.i("Here Auth token is $token") // shows correct authToken
}.also(cont::resume)
}, Handler { true })
}
}

如果要在IO调度程序中使用阻止功能:

在执行操作时,您可以将代码简化为:

suspend fun Fragment.getAuthToken(): String? {
val am: AccountManager = AccountManager.get(activity)
val accounts: Array<out Account> = am.getAccountsByType(getAccountType())

return accounts.firstOrNull()?.let { account ->
withContext(Dispatchers.IO) {
am.blockingGetAuthToken(account, getAccountType(), true).also { token ->
Timber.i("Auth token is $token") // shows correct value
}
}
}
}

并在 call 站点上执行以下操作:

lifecycleScope.launch {
val authToken = getAuthToken()?.also { goToLogin() }
toast("Auth token is $authToken")
}

关于android - 功能异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61717841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com