Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 碎片内存泄漏_Java_Android_Android Fragments_Kotlin_Memory Leaks - Fatal编程技术网

Java 碎片内存泄漏

Java 碎片内存泄漏,java,android,android-fragments,kotlin,memory-leaks,Java,Android,Android Fragments,Kotlin,Memory Leaks,我只有一个活动,所有导航都是通过片段解决的。如果我打开片段并返回,片段仍将在内存中,内存将不断增长 我做错了什么?我必须手动删除侦听器吗?在ondestory方法中,getView已为空 如何添加片段: fun replaceFragment( fragmentManager: FragmentManager?, fragment: Fragment?, frameId: Int, tag: String? ) {

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

我做错了什么?我必须手动删除侦听器吗?在
ondestory
方法中,
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
        }
    }
如何设置侦听器(在按钮上)

编辑 如果删除此行
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
        }
    }
}

您是否尝试添加“许多”片段?你真的从内存异常中得到了


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

请添加更多代码,以便我们提供帮助。您如何在不同的片段之间切换?能否添加更多代码?他们是什么听众?如果作为侦听器添加片段的对象比片段更有效,那么应该删除它们。如果您不这样做,那么您的片段将不会被垃圾收集。请检查更新的代码。
onDestroyView
可能吗?我怀疑您的
如果(fragment!=previousFragment){
失败,则会多次添加该片段。请将检查替换为
fragmentManager.findFragmentByTag(tag)==null)
如果有效,我会将其添加为应答器,但如果我单击“上一步”按钮,我将无法访问上一个Fragmnet。我认为您应该像上面那样在OnBackpress中替换片段。不,我调用replaceFragment打开下一个片段,然后按backPress关闭片段。
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
        }
    }
}