Size: a a a

Android Developers

2020 January 09

Ж

Женя in Android Developers
с сервера приходит массив с разными наборами элементов, в зависимости от типа.
обязательно ли мне создавать один громоздкий класс, обьединяющий разные типы классов или я могу принять его как ArrayList<Any> и потом Any конвертировать в нужный мне класс?
И если да, то каким образом? (item as NujniyClass) приводит к ClassCastException
источник

ОА

Оганнес Асатрян in Android Developers
lc3
Друзья, как пофиксить такую багу, ресурсы с тегами типа "<b>test</b>
выводит tv.setText(getText(R.string.test1)) норм.. а так tv.setText(getText(R.string.test1)+"@@@@@@@@@") перестают работать теги((
И не конкать в этом месте
источник

А

Александр in Android Developers
Конкать
источник

ОА

Оганнес Асатрян in Android Developers
Конкатенируй
источник

А

Александр in Android Developers
Влавствуй
источник

ОА

Оганнес Асатрян in Android Developers
Длинное слово))
источник

l

lc3 in Android Developers
Оганнес Асатрян
Длинное слово))
хз как его конектить, в отдельной переменной и в спане и в спанбилдере и чарсиквенсе, чет теги срабатывают только getString(R.string.test) я даже хз че там за конструктор срабатывает
источник

A

Anton in Android Developers
Александр
А ответьте пж вот на што.
У меня SingleActivity аппликация. При запуске приложения в container посредством replace сеттится фрагмент со сплешом. Сплеш забирает данные с апи, кеширует их и даёт команду на отображение фрагмента с контентом, который сеттится аналогично через replace.

Есть такой кейс, что если запустить апку и сразу её свернуть, а затем развернуть через какое - то время (т.е дождаться пока сплеш прогрузит данные и даст команду на переход), то я упаду с:

java.lang.IllegalStateException: FragmentManager is already executing transactions

Я это пофиксил. Я пользуюсь своим на коленке написанным навигатором, который который сеттит фрагменты используя commitNow(). Апка перестала падать, когда я заменил commitNow() на commitAllowingStateLoss().
Однако я нихрена не понял что произошло, объясните пж.

Как ни странно, мой кейс нифига не гуглится. Поэтому приходится думать головой, а эт чёт сложно.

Я знаю, что commitNow() - синхронный, а commitAllowingStateLoss() - ассинхронный. Но мне это не говорит ни о чём. В теории, мб есть какая - то связь с  тем что приложение свёрнуто и тем что вызов был именно синхронный, но чёт сомнения одолевают. В доках ничего явно не сказано на этот счёт.

Я залез чуть глубже, и увидел что этот эксепшн бросает FragmentManager ручками. Вот блок кода:

private void ensureExecReady(boolean allowStateLoss) {
       if (mExecutingActions) {
           throw new IllegalStateException("FragmentManager is already executing transactions");
       }

Логика там вроде как примерно такая: запускается транзакция, флаг сеттится в true, транзакция завершается, флаг сеттится в false. Это предположение, т.к отдебажить это я не могу - дебаггер слетает когда я апку сворачиваю, а то что я успеваю отдебажить - это ад, там этот флаг 100500 раз дёргается, нифига не понятно.

Собственно, догадок покамест нет. Моя транзакция по установке сплеша завершается успешно(скорее всего), т.к я его вижу прежде чем апку свернуть.

Шо происходет?

В моём коде нет ничего интересного, но пущай будет.

fun replaceNewFragment(screen: Screen, animationType: AnimationType? = null) {
       fragmentManager
          .beginTransaction()
          .setCustomAnimations(R.anim.anim1,R.anim.anim2)
           .replace(container, screen.getFragment(), screen.getTag())
           .commitNow()
   }
приложение сворачивалось кнопкой back? если да, то вызвался onDestroy, активити умерла. ФрагментМенеджеру стало некуда втыкать фрагмент. Именно для этих целей и используется асинхронный коммит.
источник

ОА

Оганнес Асатрян in Android Developers
lc3
хз как его конектить, в отдельной переменной и в спане и в спанбилдере и чарсиквенсе, чет теги срабатывают только getString(R.string.test) я даже хз че там за конструктор срабатывает
GetString(R.string.txt, arg)
источник

A

Anton in Android Developers
практически полный ответ на твой вопрос можешь найти здесь:
https://medium.com/inloopx/demystifying-androids-commitallowingstateloss-cb9011a544cc
источник

SO

Sergey Opivalov in Android Developers
Александр
источник

SO

Sergey Opivalov in Android Developers
Почитай, статья старая, но там причины таких эксепшенов описаны
источник

SO

Sergey Opivalov in Android Developers
Может быть полезным
источник

А

Александр in Android Developers
Anton
приложение сворачивалось кнопкой back? если да, то вызвался onDestroy, активити умерла. ФрагментМенеджеру стало некуда втыкать фрагмент. Именно для этих целей и используется асинхронный коммит.
Нет, Home. Activity жива.
Я подозреваю вот что.
Я ж Activity свернул.
В теории, она перешла в состояние, в котором она уже сохранила своё состояние(тавтология, ну что поделать).
В доках к commitNow() написано, что:

A transaction can only be committed with this method prior to its containing activity saving its state.  If the commit is attempted after that point, an exception will be thrown.

Мб это как раз тот кейс.
Правда это больше похоже на  тот злочасный Can not perform this action after onSaveInstanceState, об котором статью выше скинули.
источник

А

Александр in Android Developers
Sergey Opivalov
Почитай, статья старая, но там причины таких эксепшенов описаны
Читал ужо, благодарю. Вещь годная.
источник

А

Александр in Android Developers
Я знаю про кейс, когда мы совершаем транзакцию после того, как активити сохранила стейт, из - за чего FragmentManager бросает IllegalStateException. Мне кажется, что это не он.
источник

SO

Sergey Opivalov in Android Developers
Александр
Я знаю про кейс, когда мы совершаем транзакцию после того, как активити сохранила стейт, из - за чего FragmentManager бросает IllegalStateException. Мне кажется, что это не он.
А ты отписываешься от результата запроса в сплеше?
источник

А

Александр in Android Developers
Sergey Opivalov
А ты отписываешься от результата запроса в сплеше?
Там подписок как таковых нет, получили все данные - дёрнули навигатор. Вся ассинхронщина во viewModelScope, ничего течь не должно.
источник

А

Александр in Android Developers
Вот почему я считаю, что падение не связано со стейтом активити. Я падаю на этой строке. Manager меня валит, т.к он смотрит на флаг и считает, что какая - то транзакция ещё идёт.
источник

А

Александр in Android Developers
Vanechka777
Случайно тимлида в этой группе нет?
Оч надеюсь что нет, ибо если он спалит что я тут спрашиваю, мне пiзда)
источник