gpt4 book ai didi

android - 取消从 ViewModel 协程作业开始的改造请求

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

我希望我的应用用户能够取消文件上传。

我在 ViewModel 中的协程上传作业看起来像这样

private var uploadImageJob: Job? = null
private val _uploadResult = MutableLiveData<Result<Image>>()
val uploadResult: LiveData<Result<Image>>
get() = _uploadResult

fun uploadImage(filePath: String, listener: ProgressRequestBody.UploadCallbacks) {
//...
uploadImageJob = viewModelScope.launch {
_uploadResult.value = withContext(Dispatchers.IO) {
repository.uploadImage(filePart)
}
}
}

fun cancelImageUpload() {
uploadImageJob?.cancel()
}

然后在存储库中,Retrofit 2 请求像这样处理
suspend fun uploadImage(file: MultipartBody.Part): Result<Image> {
return try {
val response = webservice.uploadImage(file).awaitResponse()
if (response.isSuccessful) {
Result.Success(response.body()!!)
} else {
Result.Error(response.message(), null)
}
} catch (e: Exception) {
Result.Error(e.message.orEmpty(), e)
}
}

cancelImageUpload()它调用作业被取消,异常被存储库捕获,但结果不会分配给 uploadResult.value .

任何想法请如何使这项工作?

PS:有一个类似的问题 Cancel file upload (retrofit) started from coroutine kotlin android但它建议使用 coroutines call adapter现在已被贬低。

最佳答案

终于设法通过移动 withContext 使其工作像这样上一级

uploadImageJob = viewModelScope.launch {
withContext(Dispatchers.IO) {
_uploadResult.postValue(repository.uploadImage(filePart))
}
}

关于android - 取消从 ViewModel 协程作业开始的改造请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59694176/

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