Утечки памяти фрагментов - PullRequest
0 голосов
/ 18 октября 2019

У меня есть только одно действие, и вся навигация решается с помощью фрагментов. Если я открою фрагмент и вернусь, фрагмент останется в памяти, и память будет расти.

Что я делаю не так? Нужно ли вручную удалять слушателей? В методе onDestroy getView уже равен нулю.

Как добавить фрагменты:

    fun replaceFragment(
        fragmentManager: FragmentManager?,
        fragment: Fragment?,
        frameId: Int,
        tag: String?
    ) {
        if (fragmentManager != null && fragment != null) {
            val previousFragment = fragmentManager.findFragmentById(frameId)
            if (fragment != previousFragment) {
                val transaction = fragmentManager.beginTransaction()
                transaction.replace(frameId, fragment, tag)
                transaction.addToBackStack(tag)
                transaction.commitAllowingStateLoss()
            }
        }
    }

Фрагмент, закрываемый кнопкой возврата:

РЕДАКТИРОВАТЬ: КакЯ создаю фрагмент

    companion object {
        fun create(number: Long): ManageUnitFragment {
            val fragment = ManageUnitFragment()

            val params = Bundle()
            params.putLong(Keys.Number, number)
            fragment.arguments = params

            return fragment
        }
    }

Как настроить прослушиватели (для кнопок)

import kotlinx.android.synthetic.main.myFragment.*

        vMyButton.setOnClickListener {
            myAction()
        }

РЕДАКТИРОВАТЬ Если я удалю эту строку vButtonClose.setOnClickListener..., ManageUnitFragments больше не будет в дампе кучи.

ManageUnitFragment:

import kotlinx.android.synthetic.main.fragment_manage_unit.*

class ManageUnitFragment : Fragment() {

    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_manage_unit, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        vButtonClose.setOnClickListener {
            activity?.onBackPressed()
        }
    }

    companion object {
        fun create(unitNumber: Long, wagonWagonUnit: WagonUnit): ManageUnitFragment {
            val fragment = ManageUnitFragment()
            return fragment
        }
    }
}

Heap dump

1 Ответ

0 голосов
/ 18 октября 2019

Вы пытались добавить «много» фрагментов? Вы действительно получаете OutOfMemoryException?

Может быть, они просто остаются в памяти, пока не понадобится больше. Тогда они будут собирать мусор.

...