Я бы хотел, чтобы пользователи моего приложения могли отменить загрузку файла.
Моя работа по загрузке сопрограмм в 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: есть похожий вопрос Отменить загрузку файла (модификацию), начатую с сопрограммы kotlin android, но он предлагает использовать coroutines call adapter
, который теперь деприцируется.