Android 取消从ViewModel协同例程作业启动的改装请求
我希望我的应用程序用户能够取消文件上载 我在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
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))
}
}