Утечка памяти при попытке сохранить ссылку на фрагментное представление за пределы onDestoryView ()

1

Я хочу перейти от FragmentA (RootFragment) к FragmentB, но не хочу воссоздавать представление FragmentA, как только оно возвращается из FragmentB.

Я использую Jetpack Navigation для навигации между фрагментами.

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

class RootFragment : DaggerFragment() {
    private var viewToRestore: View? = null


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        return if (viewToRestore != null) {
            viewToRestore!!
        } else {
            return inflater.inflate(R.layout.fragment_root, parent, false)
        }
    }

    override fun onDestroyView() {
        viewToRestore = this.view
        super.onDestroyView()
    }

    override fun onDestroy() {
        super.onDestroy()
    }    
}

Но FragmentA (RootFragment) протекает, когда я достигаю Fragment B с атрибутом viewToRestore.

Изображение 174551

Любое решение, которое может работать без утечек, но достичь той же цели?

Теги:
android-fragments
memory-leaks
android-navigation
leakcanary

2 ответа

0

Утечка является ложным срабатыванием. С точки зрения фрагмента вполне нормально удерживать представление, которое вы создаете в onCreateView и возвращать его позже, при условии, что ваш фрагмент не сохраняется или иным образом сохраняется дольше, чем контекст, использованный для создания представления, жив.

  • 0
    Эта вещь похожа на достижение фрагмента транзакции.add ()? & Почему в навигации для Android нет опции, которая действует аналогично fragTransaction.add (), а по умолчанию это .replace (), и нет даже опции add ()?
  • 0
    @erluxman - я бы посоветовал подать проблему с тем, какую именно проблему вы пытаетесь решить (сохранить вокруг дорогостоящие виды, перекрыть несколько фрагментов, сохранить состояние просмотра и т. д.), а не сразу переходить к тому, что, по вашему мнению, должно быть решением согласно проблеме xy
Показать ещё 2 комментария
0

Проблема, которая у вас есть, является проблемой для навигации Jetpack, поскольку вы не можете добавить ее при переходе к другому фрагменту, который вы можете просто заменить:

supportFragmentManager.beginTransaction()
        .replace(R.id.fragment_container, FragmentB.newInstance())
        .addToBackStack(null)
        .commit()

supportFragmentManager.beginTransaction()
        .add(R.id.fragment_container, FragmentB.newInstance())
        .addToBackStack(null)
        .commit()

Это разница replace и add.

Я много искал и думаю, что навигация в JetPack не поддерживает add вместо replace, поэтому я рекомендую не использовать навигацию, когда важно не воссоздавать первый фрагмент

  • 0
    Я использую навигацию для Android Jetpack, у вас есть идея, что мы можем добиться фрагментаManager.add () на этой установке?
  • 0
    Круто ... есть ли причина, по которой вы знаете, что компонент навигации мог удалить метод .add ()?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню