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