gpt4 book ai didi

android - registerForActivityResult 可以在协程中使用吗?

转载 作者:行者123 更新时间:2023-12-04 15:10:26 24 4
gpt4 key购买 nike

我看到的问题是您必须保证在您自己的 Activity 的 OnCreate() 完成之前调用 registerForActivityResult() 。 OnCreate() 显然不是挂起函数,所以我不能将 registerForActivityResult() 和 ActivityResultLauncher.launch() 包装在 suspendCoroutine{} 中等待回调,因为我无法从 OnCreate 启动 suspendCoroutine 并等待它在让 OnCreate 完成之前完成...
...我确实认为我可以使用 runBlocking{} 来做到这一点,但我发现在 OnCreate 中调用 runBlocking 会导致应用程序永远挂起,而无需在 runBlocking{} block 内运行代码。
所以我的问题是 runBlocking{} 是否是正确的答案但我用错了,或者是否有其他方法可以在协程中使用 registerForActivityResult() ,或者根本不可能。

最佳答案

你可以做这样的事情。
请引用下面的实现。

class RequestPermission(activity: ComponentActivity) {
private var requestPermissionContinuation: CancellableContinuation<Boolean>? = null
@SuppressLint("MissingPermission")
private val requestFineLocationPermissionLauncher =
activity.registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
requestPermissionContinuation?.resumeWith(Result.success(isGranted))
}

suspend operator fun invoke(permission: String) = suspendCancellableCoroutine<Boolean> { continuation ->
requestPermissionContinuation = continuation
requestFineLocationPermissionLauncher.launch(permission)
continuation.invokeOnCancellation {
requestPermissionContinuation = null
}
}
}
确保在 Activity 的 onStart 之前初始化此类。 registerForActivityResult API 应该在 Activity 的 onStart 之前调用。请参阅下面的示例
class SampleActivity : AppCompatActivity()  {
val requestPermission: RequestPermission = RequestPermission(this)

override fun onResume() {
super.onResume()
lifecycleScope.launch {
val isGranted = requestPermission(Manifest.permission.ACCESS_FINE_LOCATION)
//Do your actions here
}

}
}

关于android - registerForActivityResult 可以在协程中使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65277180/

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