Size: a a a

Android Developers

2020 March 09

А

Александр in Android Developers
Andy Yanechko
сделай интерфейс для управления и реализуй его в активити, в которой этот Progressbar и в фрагментах делай так, то есть просто в onAttach достаешь контроллер и юзаешь где нужно, только в onDetach не забуть сделать = null
private var mProgressBarController: ProgressBarController? = null

override fun onAttach(context: Context) {
    super.onAttach(context)

     if (context is ProgressBarController){
       mProgressBarController = context
      }
}


....

override fun onDetach() {
     
super.onDetach()
     
mProgressBarController = null
}
Чёт жоска, что мешает просто взять объявить публичный метод в Activity и во фрагменте написать
(activity as? YourActivity).showProgressBar()?
источник

AY

Andy Yanechko in Android Developers
Александр
Чёт жоска, что мешает просто взять объявить публичный метод в Activity и во фрагменте написать
(activity as? YourActivity).showProgressBar()?
Ничего, можно и так)
источник

AY

Andy Yanechko in Android Developers
Александр
Чёт жоска, что мешает просто взять объявить публичный метод в Activity и во фрагменте написать
(activity as? YourActivity).showProgressBar()?
А вдруг эта логика будет и в другой активти и один фрагмент может быть в 2х активити и тогда нужно менять код фрагмента на:
(activity as? YourActivity1).showProgressBar()
(activity as? YourActivity2).showProgressBar()
источник

VP

Vitaly Peryatin in Android Developers
Vladimir
Почему будет утечка?
Утечка возникает тогда, когда дочерний элемент держит ссылку на родительский элемент, который живет должьше чем дочерний
То есть в твоем случае Activity может жить на протяжении всего приложения (например), а фрагмент может уничтожаться и создаваться в зависимости от перехода пользователя между экаранми или относительно твоей логики
источник

А

Александр in Android Developers
Andy Yanechko
А вдруг эта логика будет и в другой активти и один фрагмент может быть в 2х активити и тогда нужно менять код фрагмента на:
(activity as? YourActivity1).showProgressBar()
(activity as? YourActivity2).showProgressBar()
Ну ёлки, эт чуть другой вопрос.

Можно допилить мною предложенное. Если допустить, что баром могут управлять все Activity, то можно объявить интерфейс типо ProgressBarController с методами управления баром, реализовать его во всех Activity, и во фрагментах вызывать методы Activity - хоста как (activity as ProgressBarController).showProgressBar().

Хотя, зная себя, я бы бахнул общую абстрактную Activity и реализовал бы этот интерфейс там, и из фрагмента бы уже обращался как - нибудь типо (activity as BaseActivity).showProgressBar().

Или, имхо, чуть получше, пульнул бы в BaseActivity какую - нибудь progressBarliveData, и её бы из фрагментов мучил. Точнее, определил бы метод showProgress() в родительском абстрактном BaseFragment(да, люблю абстрактные классы, гоните меня, намехайтесь надо мной(( ), и его бы мучал ужо.
источник

AY

Andy Yanechko in Android Developers
Александр
Ну ёлки, эт чуть другой вопрос.

Можно допилить мною предложенное. Если допустить, что баром могут управлять все Activity, то можно объявить интерфейс типо ProgressBarController с методами управления баром, реализовать его во всех Activity, и во фрагментах вызывать методы Activity - хоста как (activity as ProgressBarController).showProgressBar().

Хотя, зная себя, я бы бахнул общую абстрактную Activity и реализовал бы этот интерфейс там, и из фрагмента бы уже обращался как - нибудь типо (activity as BaseActivity).showProgressBar().

Или, имхо, чуть получше, пульнул бы в BaseActivity какую - нибудь progressBarliveData, и её бы из фрагментов мучил. Точнее, определил бы метод showProgress() в родительском абстрактном BaseFragment(да, люблю абстрактные классы, гоните меня, намехайтесь надо мной(( ), и его бы мучал ужо.
Я тоже люблю абстрактные классы.

Да, что то не подумал, что можно сделать:
(activity as? ProgressBarController).showProgressBar()

Тогда этот вариант по быстрее будет)
источник

К

Кирилл in Android Developers
У viewpager2 уже можно ставить размеры в wrap content?
источник

V

Vladimir in Android Developers
Andy Yanechko
Остается ссылка на активти
Пока все равно не понимаю, где утечка?)
Фрагмент уничтожится, активити уничтожилась, фрагмент пересоздался, новая ссылка на активити.
Фрагмент retain, отцепился от активити, активити пересоздалась - фрагмент держит ссылку на новую активити.
источник

VP

Vitaly Peryatin in Android Developers
Мне нужно сделать что-то на подобии RecyclerView через ScrollView, при добавленни в начало новой View фокус переходит на него и ScrollView пролистывается вверх
Как сделать так, чтобы при добавлении новых View в начало списка scroll никуда не дергался?
источник

AS

Anna Sidorova in Android Developers
Vitaly Peryatin
Утечка возникает тогда, когда дочерний элемент держит ссылку на родительский элемент, который живет должьше чем дочерний
То есть в твоем случае Activity может жить на протяжении всего приложения (например), а фрагмент может уничтожаться и создаваться в зависимости от перехода пользователя между экаранми или относительно твоей логики
Утечка возникает тогда, когда возникают циклические ссылки. Тут важно только это. Если объект ссылается на активити, но активити на него - нет, то все норм.
Пугают ссылками на активити в первую очередь по другим причинам: а) статические поля, тут вообще амба; б) если сменится контекст (например новая активити открылась, то она утечет, пока объект существует). Мне кажется, людям сложнее донести проблему взаимных ссылок, нежели просто напугать и сказть "низзя!" 😊
источник

VP

Vitaly Peryatin in Android Developers
Anna Sidorova
Утечка возникает тогда, когда возникают циклические ссылки. Тут важно только это. Если объект ссылается на активити, но активити на него - нет, то все норм.
Пугают ссылками на активити в первую очередь по другим причинам: а) статические поля, тут вообще амба; б) если сменится контекст (например новая активити открылась, то она утечет, пока объект существует). Мне кажется, людям сложнее донести проблему взаимных ссылок, нежели просто напугать и сказть "низзя!" 😊
Не правда

GC умеет разрешать циклические ссылки
Например, если Вы будете хранить View внутри поля Activity (а View внутри держит ссылку на Activity), то утечки не произойдет
источник

АД

Андрей Данилов... in Android Developers
Anna Sidorova
Утечка возникает тогда, когда возникают циклические ссылки. Тут важно только это. Если объект ссылается на активити, но активити на него - нет, то все норм.
Пугают ссылками на активити в первую очередь по другим причинам: а) статические поля, тут вообще амба; б) если сменится контекст (например новая активити открылась, то она утечет, пока объект существует). Мне кажется, людям сложнее донести проблему взаимных ссылок, нежели просто напугать и сказть "низзя!" 😊
Обычные циклические ссылки GC вывозит так-то
источник

АД

Андрей Данилов... in Android Developers
Дело в достижимости от gc root
источник

VP

Vitaly Peryatin in Android Developers
Anna Sidorova
Утечка возникает тогда, когда возникают циклические ссылки. Тут важно только это. Если объект ссылается на активити, но активити на него - нет, то все норм.
Пугают ссылками на активити в первую очередь по другим причинам: а) статические поля, тут вообще амба; б) если сменится контекст (например новая активити открылась, то она утечет, пока объект существует). Мне кажется, людям сложнее донести проблему взаимных ссылок, нежели просто напугать и сказть "низзя!" 😊
Если быть честным, то все дело в gc root
источник

AS

Anna Sidorova in Android Developers
Vitaly Peryatin
Не правда

GC умеет разрешать циклические ссылки
Например, если Вы будете хранить View внутри поля Activity (а View внутри держит ссылку на Activity), то утечки не произойдет
Я вообще не про фрагмент и вью. Ну да ладно
источник

VP

Vitaly Peryatin in Android Developers
Anna Sidorova
Я вообще не про фрагмент и вью. Ну да ладно
Но все же само утверждение было некорректное (как мне показалось)
источник

AS

Anna Sidorova in Android Developers
Пойду вкурю, возможно GC в Андроиде для меня пока тайна 😊
источник

AS

Anna Sidorova in Android Developers
Vitaly Peryatin
Но все же само утверждение было некорректное (как мне показалось)
Скажем так - стриггернуло. Работаю с несколькими языками. Больнее всего с языками с управлением памятью без сборщиков. strong, weak, unowned, shared и прочие указатели
источник

АД

Андрей Данилов... in Android Developers
Anna Sidorova
Пойду вкурю, возможно GC в Андроиде для меня пока тайна 😊
В смысле блин, такой же как в обычной жабе
источник

АД

Андрей Данилов... in Android Developers
Vitaly Peryatin
Утечка возникает тогда, когда дочерний элемент держит ссылку на родительский элемент, который живет должьше чем дочерний
То есть в твоем случае Activity может жить на протяжении всего приложения (например), а фрагмент может уничтожаться и создаваться в зависимости от перехода пользователя между экаранми или относительно твоей логики
Да да, только надо уточнить что под дочерними классами имеются объекты анонимных классов и нестатических nested, так как и те и другие содержат неявно ссылку на родителя
источник