Проблемы инициализации приложения - условная навигация и инициализация объекта комнаты

Я борюсь с тем, как инициализировать свое приложение. Мне нужно проверить две вещи (дело и учетную запись), прежде чем показывать идеальный начальный экран. Для запуска приложения должен быть хотя бы один из них. Поэтому, если их нет, мне нужно, чтобы они были созданы или найдены / подключены (например, для входа в систему). У каждого будет свой экран (-а) для этого, и эти потоки должны быть доступны с других экранов (например, из настроек), поскольку в приложении может быть несколько таких экранов. Я хотел бы:

  • Проверьте учетную запись по умолчанию, если ее нет, проверьте любую учетную запись, если ее нет, перейдите к фрагменту создания / привязки учетной записи.
  • Проверьте вариант по умолчанию, если его нет, проверьте любой вариант, если его нет, перейдите к фрагменту дела создания / ссылки.
  • Показать начальный экран.

Каждая из проверок должна будет получить объект из базы данных Room, когда он будет найден.

Я собирался использовать условную навигацию, поскольку это похоже на то, что требуется , но пример очень упрощен. Прежде всего, событие - это нажатие кнопки, в то время как моему процессу нужно проверить базу данных. Эта часть, кажется, усложняет мне задачу, поскольку проверка базы данных - это асинхронный процесс, а инициализация приложения - нет. Я не могу показать главный экран, пока не закончу проверку. Выполнение этих проверок в основном потоке не кажется правильным подходом. Об этом есть много сообщений.

Поскольку я не могу показать главный экран без двух установленных объектов и не должен запускать запросы в основном потоке, я нашел ссылки на экран-заставку. Это также вызывает некоторые разногласия по этому поводу.

Я пробовал этот подход, используя Executor для выполнения запросов:

Executor executor = Executors.newSingleThreadExecutor();

... а затем, если процесс инициализации завершен, перейдите на главный экран, но я столкнулся с ошибкой:

FATAL EXCEPTION: pool-1-thread-1
android.util.AndroidRuntimeException: Animators may only be run on Looper threads

Это похожий сценарий, но

Я уверен, что это было сделано раньше. Как подходят другие люди 1) условная навигация при запуске приложения 2) вызовы асинхронной базы данных в процессе инициализации.


person lcj    schedule 28.10.2020    source источник
comment
Можете ли вы показать код, который вы пробовали? Вы можете установить startDestination условно в потоке пользовательского интерфейса после выполнения запроса в фоновом потоке.   -  person Nongthonbam Tonthoi    schedule 29.10.2020