Используя последнюю версию LiveData «androidx.lifecycle: lifecycle-liveata-ktx: 2.2.0-alpha03», я разработал код для функции «Поиск продуктов» в ViewModel, используя новый строительный блок LiveData (LiveData + Coroutine), который выполняет синхронный сетевой вызов с помощью Retrofit и соответственно обновляет различные флаги (isLoading, isError) в ViewModel. Я использую Transforamtions.switchMap для «запроса» LiveData, поэтому всякий раз, когда происходит изменение «запроса» из пользовательского интерфейса, код «Search Products» начинает выполнение с помощью Transformations.switchMap. Все работает нормально, за исключением того, что я хочу отменить предыдущий вызов модернизации всякий раз, когда в «запросе» LiveData происходит изменение. В настоящее время я не вижу способа сделать это. Любая помощь будет оценена по достоинству.
class ProductSearchViewModel : ViewModel() {
val completableJob = Job()
private val coroutineScope = CoroutineScope(Dispatchers.IO + completableJob)
// Query Observable Field
val query: MutableLiveData<String> = MutableLiveData()
// IsLoading Observable Field
private val _isLoading = MutableLiveData<Boolean>()
val isLoading: LiveData<Boolean> = _isLoading
val products: LiveData<List<ProductModel>> = query.switchMap { q ->
liveData(context = coroutineScope.coroutineContext) {
emit(emptyList())
_isLoading.postValue(true)
val service = MyApplication.getRetrofitService()
val response = service?.searchProducts(q)
if (response != null && response.isSuccessful && response.body() != null) {
_isLoading.postValue(false)
val body = response.body()
if (body != null && body.results != null) {
emit(body.results)
}
} else {
_isLoading.postValue(false)
}
}
}
}