Отмена запроса на модификацию, запущенного из сопрограммного задания ViewModel - PullRequest
0 голосов
/ 11 января 2020

Я бы хотел, чтобы пользователи моего приложения могли отменить загрузку файла.

Моя работа по загрузке сопрограмм в 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, который теперь деприцируется.

1 Ответ

1 голос
/ 12 января 2020

Наконец-то удалось заставить его работать, подняв withContext на один уровень вверх, как это

uploadImageJob = viewModelScope.launch {
    withContext(Dispatchers.IO) {
        _uploadResult.postValue(repository.uploadImage(filePart))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...