首页 > 解决方案 > 碎片内存泄漏

问题描述

我只有一个活动,所有导航都是通过片段解决的。如果我打开片段并返回,片段将仍在内存中,并且内存将不断增长。

我究竟做错了什么?我必须手动删除侦听器吗?在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 将不再在堆转储中。

管理单元片段:

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
        }
    }
}

堆转储

标签: javaandroidandroid-fragmentskotlinmemory-leaks

解决方案


您是否尝试添加“许多”片段?你真的明白了OutOfMemoryException吗?

也许他们只是留在记忆中,直到需要更多记忆。然后它们将被垃圾收集。


推荐阅读