取消从 ViewModel 协程作业启动的改造请求

yau*_*nka 5 android coroutine viewmodel kotlin retrofit2

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

我在 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()
}
Run Code Online (Sandbox Code Playgroud)

然后在存储库中,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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

yau*_*nka 5

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

uploadImageJob = viewModelScope.launch {
    withContext(Dispatchers.IO) {
        _uploadResult.postValue(repository.uploadImage(filePart))
    }
}
Run Code Online (Sandbox Code Playgroud)