Size: a a a

StartAndroid Ru Chat

2020 October 02

SP

Sergey Panov in StartAndroid Ru Chat
Филипп Марченко
Всем привет. Вопрос по связке LiveData + Retrofit + Corutines. Сделал сетевые запросы в проекте по примеру с https://itnext.io/android-architecture-hilt-mvvm-kotlin-coroutines-live-data-room-and-retrofit-ft-8b746cab4a06. Сложность возникла при попытке запустить несколько запросов последовательно. У меня репозиторий возвращает на запрос логина LiveData<Resource<AuthResponse>>. В AuthResponse у меня токен. Далее мне надо с сервера достать юзера используя этот токен.Делаю я обьеденение двух лайвдат с помощью switchMap. Но проблема в том что вызовы на сервер каскадируются. Вызов getUser вызывается 2 раза, если добавить еще один вызов через switchMap, то третий вызов вызовится уже 3 раза , и т.д. Что я делаю не так?
val login = LiveEvent()
   val _login = login.switchMap {
       userRepo.login(email,password)
   }.switchMap {
       userRepo.getUser()
   }
Покажи как ты делаешь запросы последовательно...
источник

ФМ

Филипп Марченко... in StartAndroid Ru Chat
Sergey Panov
Покажи как ты делаешь запросы последовательно...
val login = LiveEvent()
   val _login = login.switchMap {
       userRepo.login(email,password)
   }.switchMap {
       userRepo.getUser()
   }
источник

ФМ

Филипп Марченко... in StartAndroid Ru Chat
Филипп Марченко
val login = LiveEvent()
   val _login = login.switchMap {
       userRepo.login(email,password)
   }.switchMap {
       userRepo.getUser()
   }
Здесь userRepo.getUser() вызывается 2 раза
источник

ФМ

Филипп Марченко... in StartAndroid Ru Chat
fun <T> performPostOperation(networkCall: suspend () -> Resource<T>, saveCallResult: suspend (T) -> Unit): LiveData<Resource<T>> =
   liveData(Dispatchers.IO) {
       emit(Resource.loading())

       val responseStatus = networkCall.invoke()
       if (responseStatus.status == Resource.Status.SUCCESS) {
           responseStatus.data?.let{data->  saveCallResult(data)}
           emit(Resource.success(responseStatus.data!!))
       } else if (responseStatus.status == Resource.Status.ERROR) {
           emit(Resource.error(responseStatus.message!!))
       }
   } Вот как происходит оборачивание retrofit вызова в лайвдату.
источник

SP

Sergey Panov in StartAndroid Ru Chat
Филипп Марченко
fun <T> performPostOperation(networkCall: suspend () -> Resource<T>, saveCallResult: suspend (T) -> Unit): LiveData<Resource<T>> =
   liveData(Dispatchers.IO) {
       emit(Resource.loading())

       val responseStatus = networkCall.invoke()
       if (responseStatus.status == Resource.Status.SUCCESS) {
           responseStatus.data?.let{data->  saveCallResult(data)}
           emit(Resource.success(responseStatus.data!!))
       } else if (responseStatus.status == Resource.Status.ERROR) {
           emit(Resource.error(responseStatus.message!!))
       }
   } Вот как происходит оборачивание retrofit вызова в лайвдату.
"Делаю я обьеденение двух лайвдат с помощью switchMap"
Попробуй сделать получение токена и пользователя в одной корутине.
источник

SP

Sergey Panov in StartAndroid Ru Chat
Филипп Марченко
val login = LiveEvent()
   val _login = login.switchMap {
       userRepo.login(email,password)
   }.switchMap {
       userRepo.getUser()
   }
Я не понимаю что делает метод   userRepo.getUser() и   userRepo.login(email,password)
источник

SP

Sergey Panov in StartAndroid Ru Chat
Sergey Panov
Я не понимаю что делает метод   userRepo.getUser() и   userRepo.login(email,password)
Что они возвращают?
источник

ФМ

Филипп Марченко... in StartAndroid Ru Chat
Sergey Panov
"Делаю я обьеденение двух лайвдат с помощью switchMap"
Попробуй сделать получение токена и пользователя в одной корутине.
Можно так, сделать, но я хочу именно сделать цепочку из лайвдат, так как это делалось в RxJava,там я делал иногда и по 5 запросов подряд(с помощью того же switchMap, с промежуточным сохранением результатов, и ветвлениями в зависимости от ответа от сервера.
userRepo.login - возвращает LiveData<Resource<AuthResponse>>
userRepo.getUser() - этот возвращает  LiveData<Resource<User>>. Вот я просто хочу получить одну лайвдату из этих двух, чтобы на нее подписатся , при подписке показали спинер, при успехе спрятали - сделали логин, при неудаче спрятали , показали ошибку
источник

ФМ

Филипп Марченко... in StartAndroid Ru Chat
В общем причину нашел, если не эмитить состояние LOADING, то выполняются ровно столько запросов сколько сделаешь switchMap. Прийдется в такий кейсах перед вызовом лайвдаты запускать спинер. Почему так происходит так и не разобрался, сделал такой флаг пока
if(emitLoading){
           emit(Resource.loading())
       }
источник

R

RoSysTem in StartAndroid Ru Chat
Всем привет! Ребят, кто работал с wifi на API >=29? Проконсультируйте в лс пожалуйста
источник
2020 October 03

K

Krohin in StartAndroid Ru Chat
товарищи. Подскажите. получаю данные с firebase они получаются в onComplet . но из этого метода как я понял эти даные я вытащить и сохранить не могу?
источник

R

R C H in StartAndroid Ru Chat
В чем проблема, помогите пожалуйста :(
источник

P

Pavel Pokatilo in StartAndroid Ru Chat
Если выкладывал приложение в гугл плей со своей подписью, но при выкладывании выбрал подпись гуглом, если мне нужно добавить сертификат для google maps sdk то где его взять? или брать тот сертификат которым подписывал релизный appbundle?
источник

ДШ

Данил Шидловский... in StartAndroid Ru Chat
что там изменилось с locationListener? Я нигде информацию найти не могу
источник

A

Abu in StartAndroid Ru Chat
Хелп плз
источник

ДШ

Данил Шидловский... in StartAndroid Ru Chat
гугл?
источник

A

Abu in StartAndroid Ru Chat
Не успеваю
источник

A

Abu in StartAndroid Ru Chat
Еще 5 вопросов сам решаю
источник

A

Abu in StartAndroid Ru Chat
Для стажировки нужно
источник

ДШ

Данил Шидловский... in StartAndroid Ru Chat
final нельзя переопределить
источник