TransWikia.com

Нe открывается fragment

Stack Overflow на русском Asked on December 30, 2021

Есть программа для работы со списками.
По интерфейсу есть два основных окна, в одном лист со списками, и по клику со конкретному списку по подаем на экран с элементами списка.
Приложение представляет собой SingleActivity moxy+androidx.navigation+rxjava
Проблема возникает при следующем кейсе.
Я открываю deeplink в мессанжере, скачиваю новые данные из firebase, сохраняю данные в room и после этого автоматом пытаюсь уже перейти на новый фрагмент
Вот так не работает

     model.saveShop(dlDl, currentDlId).observeOn(mainThread)
        .subscribe { list->
            goToList(listId = list.id!!)}}

А вот так уже работает

 model.saveShop(dlShop, currentDlId).observeOn(mainThread)
        .subscribe { list->
            Single
                .timer(100,TimeUnit.MILLISECONDS)
               .observeOn(mainThread).subscribe { _->
                goToList(listId = list.id!!)
            }
           
        }

Пробовал во втором(проблемном фрагменте раставлять точки breakPoint и логи)
В итоге по логам второй фрагмент пытается запускаться, метод onCreateView отрабатывает, в презетере attachView тоже отрабатывается, данные с загруженого листа в полной мере загружаются из базы данных, но логи раставленые в фрагменте на вызовы функций из презеттера типа viewState.doSomething() уже не вызываются
в логах нет ни единой ошибки или краша
Что может происходить такого, чтоб фрагмент в итоге не запускался.

One Answer

Room товарищ весьма умный, и часто позволяет себе асинхронность там, где может ее обеспечить. Тот факт что задержка в 100мс решает вашу проблему говорит мне, что вы столкнулись именно с таким поведением. Заставьте его притормозить прицепив к @Insert методу возвращаемое значение, должно помочь

@Dao
public interface SomeDao {
   @Insert(onConflict = REPLACE)
   fun addSome(Some object): Int
}

Теперь методу придется сначала выполнится целиком чтобы вернуть вам айдишник вставленного элемента. А на всякий случай я бы еще и клал это число в какую-то переменную и выводил в логи, а то Cursor из обычной библиотеки с SQLite вам возвращается почти мгновенно всегда, но данных в нем еще может не быть, т.к. они асинхроно добываются. И когда вы попытаетесь получить первую строчку подвисните на 300мс, а все последуюшщие будут читаться за 1мс. Вдруг тут каким-то образом тоже так сработает?

Answered by Спицко Дмитрий on December 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP