Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 取消从ViewModel协同例程作业启动的改装请求_Android_Kotlin_Retrofit2_Viewmodel_Coroutine - Fatal编程技术网

Android 取消从ViewModel协同例程作业启动的改装请求

Android 取消从ViewModel协同例程作业启动的改装请求,android,kotlin,retrofit2,viewmodel,coroutine,Android,Kotlin,Retrofit2,Viewmodel,Coroutine,我希望我的应用程序用户能够取消文件上载 我在ViewModel中的协同程序上载作业如下所示 private var uploadImageJob: Job? = null private val _uploadResult = MutableLiveData<Result<Image>>() val uploadResult: LiveData<Result<Image>> get() = _uploadResult fun upload

我希望我的应用程序用户能够取消文件上载

我在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()
}
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)
    }
}
uploadImageJob = viewModelScope.launch {
    withContext(Dispatchers.IO) {
        _uploadResult.postValue(repository.uploadImage(filePart))
    }
}
private var uploadImageJob:Job?=无效的
private val_uploadResult=MutableLiveData()
val上传结果:LiveData
get()=\u上传结果
有趣的uploadImage(文件路径:字符串,侦听器:ProgressRequestBody.UploadCallbacks){
//...
uploadImageJob=viewModelScope.launch{
_uploadResult.value=withContext(Dispatchers.IO){
repository.uploadImage(filePart)
}
}
}
fun cancelImageUpload(){
上载ImageJob?.cancel()
}
然后在存储库中,翻新2请求的处理方式如下

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()
}
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)
    }
}
uploadImageJob = viewModelScope.launch {
    withContext(Dispatchers.IO) {
        _uploadResult.postValue(repository.uploadImage(filePart))
    }
}
suspend fun uploadImage(文件:MultipartBody.Part):结果{
回击{
val response=webservice.uploadImage(文件).awaitResponse()
if(response.issucessful){
Result.Success(response.body()!!)
}否则{
Result.Error(response.message(),null)
}
}捕获(e:例外){
Result.Error(e.message.orEmpty(),e)
}
}
当调用
cancelImageUpload()
时,作业被取消,异常在存储库中被捕获,但结果不会分配给
uploadResult.value

有什么好主意吗?请告诉我怎么做


PS:有一个类似的问题,但它建议使用
coroutines call adapter
,这一点现在已经过时了。

通过像这样将
与上下文一起上移一级,最终成功地使其工作

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()
}
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)
    }
}
uploadImageJob = viewModelScope.launch {
    withContext(Dispatchers.IO) {
        _uploadResult.postValue(repository.uploadImage(filePart))
    }
}