Hovhannes
Мне встроить чаты в прилагу музла
Mike
А разве телеги не было на гитхабе ?
только фронты, и те под GPL, да и никто не захочет иметь у себя ТАКОЕ количество костылей
Алиса /446
Каких костылей
только велосипеды
Mike
Каких костылей
мм, тех, из которых тг состоит чуть более, чем полностью https://habr.com/ru/post/472970/
Hovhannes
Разве тот код который доступен всем для ознакомления является текущим рабочим кодом тг?
Aba
Коллеги, есть кто из владельцев mi note 10 ?
Евгений
привет! Если ли возможность кастануть класс на Any в котлин ?
Aba
Интересует наличие у wifi поддержки mimo
Mike
Разве тот код который доступен всем для ознакомления является текущим рабочим кодом тг?
в случае с андроидным клиентом — нет, на гитхабе старый код
Mike
Тебе в чат котлин
нет, в формулирование вопросов
Mike
Вот и все
кто «все»?
Hovhannes
кто «все»?
Доебался)) вот и всё
Aba
что?
поправил мессагу. Поддержка mimo
Александр
А ответьте пж вот на што. У меня 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() }
Александр
💥
Vladimir
Напомните, пожалуйста, список чатов в ТГ для программистов!🙏
Александр
Метод уточки не помогает ><
lbai
Друзья, как пофиксить такую багу, ресурсы с тегами типа "<b>test</b> выводит tv.setText(getText(R.string.test1)) норм.. а так tv.setText(getText(R.string.test1)+"@@@@@@@@@") перестают работать теги((
Vladimir
github.com/goq/telegram-list
Благодарю🙏
Sergey
> Как ни странно, мой кейс нифига не гуглится. Поэтому приходится думать головой, а эт чёт сложно. Все гуглится, это распространенная проблема > Я знаю, что commitNow() - синхронный, а commitAllowingStateLoss() - ассинхронный. commit/commitAllowingStateLoss - асинхронные, тоже самое с приставкой Now - синхронные. Гугли, куча инфы по этому кейсу
Sergey
А ответьте пж вот на што. У меня 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() }
.
Евгений
что?
с сервера приходит массив с разными наборами элементов, в зависимости от типа. обязательно ли мне создавать один громоздкий класс, обьединяющий разные типы классов или я могу принять его как ArrayList<Any> и потом Any конвертировать в нужный мне класс? И если да, то каким образом? (item as NujniyClass) приводит к ClassCastException
Александр
Конкать
Hovhannes
Конкатенируй
Александр
Влавствуй
Hovhannes
Длинное слово))
lbai
Длинное слово))
хз как его конектить, в отдельной переменной и в спане и в спанбилдере и чарсиквенсе, чет теги срабатывают только getString(R.string.test) я даже хз че там за конструктор срабатывает
Anton
А ответьте пж вот на што. У меня 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, активити умерла. ФрагментМенеджеру стало некуда втыкать фрагмент. Именно для этих целей и используется асинхронный коммит.
Anton
практически полный ответ на твой вопрос можешь найти здесь: https://medium.com/inloopx/demystifying-androids-commitallowingstateloss-cb9011a544cc
Sergey
https://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html
Sergey
Почитай, статья старая, но там причины таких эксепшенов описаны
Sergey
Может быть полезным
Александр
приложение сворачивалось кнопкой 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, об котором статью выше скинули.
Александр
практически полный ответ на твой вопрос можешь найти здесь: https://medium.com/inloopx/demystifying-androids-commitallowingstateloss-cb9011a544cc
Я знаю про кейс, когда мы совершаем транзакцию после того, как активити сохранила стейт, из - за чего FragmentManager бросает IllegalStateException. Мне кажется, что это не он.
Александр
А ты отписываешься от результата запроса в сплеше?
Там подписок как таковых нет, получили все данные - дёрнули навигатор. Вся ассинхронщина во viewModelScope, ничего течь не должно.
Александр
Вот почему я считаю, что падение не связано со стейтом активити. Я падаю на этой строке. Manager меня валит, т.к он смотрит на флаг и считает, что какая - то транзакция ещё идёт.
Александр
Случайно тимлида в этой группе нет?
Оч надеюсь что нет, ибо если он спалит что я тут спрашиваю, мне пiзда)
Hovhannes
Ой да не пох?
Александр
Michael
Да че ты переживаешь Всегда есть @mobile_jobs
Hovhannes
Ору в голосину
Александр
практически полный ответ на твой вопрос можешь найти здесь: https://medium.com/inloopx/demystifying-androids-commitallowingstateloss-cb9011a544cc
Кстати, в конце этой статьи есть хороший такой инсайт: Always first analyse why the transaction is being executed after onStop(). Я так понимаю, транзакция после onStop() - это по дефолту плохо?
Александр
Да че ты переживаешь Всегда есть @mobile_jobs
Вообще не переживаю, я погрузчик умею водить ;)
Hovhannes
Свет клином на ИТ не сошёлся
Александр
После онресторинстанс
Ну блин, а ежели юзер свернул апку, а у него там через какое - то время случился какой - то ивент, который тригернул commit()? Типо, правильнее будет передумать подход, и сделать так, чтобы транзакция не вызывалась, а вью просто была в курсе, что по возвращению к приложению надо бы где - нибудь в onResume() совершить транзакцию?
You
Свет клином на ИТ не сошёлся
Ты про архитектуру?
Hovhannes
Александр
У него не сходится чёт там
Hovhannes
Или в активити есть метод онпострезюм
Александр
После онрезюм делай свои транзакции
Ну да, logic. Это шо мне со сплешом то делать. Получается, после того как фрагмент завершит тянуть данные с сервера, нужно проверить в каком состоянии фрагмент, и если будет что - то типо paused/stopped(хз, я тупой и не знаю состояния фрагмента), бахнуть какой - нибудь флаг, чтобы в onResume() был совершен переход. Да?
Александр
И везде так делать, где есть навигация. Жость.
Hovhannes
Гуголь все придумал
Hovhannes
Бери и юзай
Александр
Ливдата
А что ливдата? Она не заэмиттит ничего из paused/stopped?
Aleksey
А что ливдата? Она не заэмиттит ничего из paused/stopped?
ну да, вроде лайфсайклоунер для этого существует
Hovhannes
А что ливдата? Она не заэмиттит ничего из paused/stopped?
И не надо. Она после онрезюм бахнет транзакции
Hovhannes
Можешь руками сделать как я в 2018 году)))
Hovhannes
Но потом придумали ливдату
Александр
Понял принял, благодарю, пойду прокачаю навигацию. А то походу говна кусок написал.
Hovhannes
Сингл активити хорош тем что там можно жахнуть навигацию и все