gpt4 book ai didi

android - 线程中的 KMM In CorrectDereferenceException

转载 作者:行者123 更新时间:2023-12-05 00:18:17 36 4
gpt4 key购买 nike

我一直在尝试使用共享模块 KMM 将图像上传到 aws s3 服务器。它在 Android 中工作得很好,但在 iOS 中我遇到了这个问题:- 未捕获的 Kotlin 异常:kotlin.native.In CorrectDereferenceException:非法尝试访问非共享

现在,尽管我对此进行了尽可能多的搜索,但我知道它与 frozen() 相关,但我不确定它是什么以及如何解决这个问题。

代码:-

actual class ClassName {

init {
ensureNeverFrozen()
}

actual fun imageUpload() {

var credentialsProvider = AWSCognitoCredentialsProvider(regionType = // Region here, identityPoolId = //identityPoolId here)

var configuration = AWSServiceConfiguration(region = // Region here, credentialsProvider = //credentialsProvider here)

AWSServiceManager.defaultServiceManager()?.defaultServiceConfiguration = configuration

val expression = AWSS3TransferUtilityUploadExpression()

// Start uploading using AWSS3TransferUtility
val awsTransferUtility = AWSS3TransferUtility.defaultS3TransferUtility()
val completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock
completionHandler = { _: AWSS3TransferUtilityUploadTask?, error: NSError? ->
if (error == nil) {
val url = AWSS3.defaultS3().configuration.endpoint()?.URL()
val publicURL = url?.URLByAppendingPathComponent("bucketName")?.URLByAppendingPathComponent("fileName")
// Image Upload Complete
} else {
// Image Upload failure
}
}
awsTransferUtility.uploadFile(
fileUrl!!,
bucket = "bucketName",
key = "fileName",
contentType = ".image",
expression = expression,
completionHandler = completionHandler. // Error pointed on this line
)
}
}

现在,只要我调用该函数,我的应用程序就会崩溃,并将错误指向 completionHandler

错误日志:-

Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal attempt to access non-shared ClassName.$imageUpload$lambda-1$lambda-0$FUNCTION_REFERENCE$1@2803dc8 from other thread
at 0 iosApp 0x000000010cc1984f kfun:kotlin.Throwable#<init>(kotlin.String?){} + 95
at 1 iosApp 0x000000010cc138cd kfun:kotlin.Exception#<init>(kotlin.String?){} + 93
at 2 iosApp 0x000000010cc139fd kfun:kotlin.RuntimeException#<init>(kotlin.String?){} + 93
at 3 iosApp 0x000000010cc327fd kfun:kotlin.native.IncorrectDereferenceException#<init>(kotlin.String){} + 93
at 4 iosApp 0x000000010cc3461f ThrowIllegalObjectSharingException + 623
at 5 iosApp 0x000000010cd16fc2 _ZN12_GLOBAL__N_128throwIllegalSharingExceptionEP9ObjHeader + 34
at 6 iosApp 0x000000010cd170fd _ZN12_GLOBAL__N_136terminateWithIllegalSharingExceptionEP9ObjHeader + 13
at 7 iosApp 0x000000010cd1af0a _ZNK16KRefSharedHolder3refIL11ErrorPolicy3EEEP9ObjHeaderv + 58
at 8 iosApp 0x000000010cbf53ca _ZL39Kotlin_Interop_unwrapKotlinObjectHolderP11objc_object + 42
at 9 iosApp 0x000000010cbee050 _4b4d4d4c69623a736861726564_knbridge15 + 224
at 10 AWSS3 0x000000010d84509e -[AWSS3TransferUtility URLSession:task:didCompleteWithError:] + 4814

最佳答案

原生并发模型 available用于预览。查看New memory model migration guide 。发布后您不应该遇到任何此类问题,但在此之前上述答案都是有效的。


尝试调用completionHandler.freeze()

或者,将处理程序移动到函数调用(不将其存储在变量中)。

如果在处理程序内部您使用外部作用域中的一些变量,它们可能也需要卡住。如果前两种方法都不起作用,请尝试仅用 print() 替换完成内容,看看是否有帮助,如果有帮助,请通过逐一取消注释部分代码来本地化有问题的行。

KMM 并发模型禁止从不同线程访问可变对象,并且 freeze 使对象不可变,以便可以从不同线程使用它。

使用协程,对象会在需要时自动卡住,但是当您在没有协程的情况下切换线程时,您必须手动完成。

这正是这里发生的情况:AWS 从另一个线程调用 completionHandler(这对于完成方法来说很常见)

在此处查看有关并发模型的更多信息:https://kotlinlang.org/docs/mobile/concurrency-overview.html

这种行为是我们目前必须使用 KMM 来管理的,但很快就会改变,这是 KMM 从 alpha 版本到发布版的主要阻碍因素,JetBrains 团队专注于解决这个特定问题,因此我们不这样做不必再使用freeze()

关于android - 线程中的 KMM In CorrectDereferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68625732/

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