Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add navigation transactions in message queue #151

Merged

Conversation

VitalyPeryatin
Copy link
Contributor

@VitalyPeryatin VitalyPeryatin commented Apr 8, 2021

Бывают кейсы, когда нужно выполнить навигацию вне Main потока (например, когда нужно открыть LoginActivity при определенном ответе из Interceptor). В таком случае было бы удобно, если бы все команды переключались бы на Main поток внутриCicerone (с фрагментами можно работать только из Main потока). На сколько это актуально было бы внести в либу? Вприцнипе реализуется 10-ю строчками кода + ошибка FragmentManager is already executing transactions больше возникать не будет. При выполнении многих ранзакций почти одновременно эта ошибка все равно будет возникать без добавления сообщений в очередь сообщений

От Константина (https://t.me/Cicerone_RUS/11631):
"про многопоточку: это ответственность разработчика следить за синхронизацией и вызывать команды на роутере синхронно.
но выполнять команды на фрагментменеджере не напрямую, а через отправку сообщений - норм идея"


override fun applyCommands(commands: Array<out Command>) {
mainHandler.post {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

здесь можно добавить проверку:

        if (Thread.currentThread() != uiThread) {
           mainHandler.post {
              applyCommandsSync(commands)
           }
        } else {
           applyCommandsSync(commands)
        }

иначе может произойти неприятная задержка, поскольку .post положит действие в очередь сообщений

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Специально отправляю каждое сообщение через post, создавая задержку, чтобы не возникала ошибка FragmentManager is already executing transactions

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

так я и предлагаю избежать ее в случае, если мы итак в главном потоке

Copy link
Contributor Author

@VitalyPeryatin VitalyPeryatin Apr 8, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если мы и так в главном потоке и происходит обработка сразу 2-х транзакций в момент обработки только одного сообщения из MessageQueue (то есть один из флажков внутри реализаций фрагментов не успеет переключиться) вылезет FragmentManager is already executing transactions
В случае если отправляем сообщения всегда через post, то предыдущая транзакция всегда сначала завершится, а следующим сообщением будет обрабатываться новая фрагмент транзакция

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants