Android Navigation 解决 Adapter内存泄漏

以前写过一篇 Navigation 导致内存泄漏的文章 Android 解决XXX Layout leaked 使用Navigation 踩坑 XML内存泄漏
,这次算补充吧。
场景是 当一个有RecyclerView的页面跳转的时候发生内存泄漏的
还是先上报错图
异常截图
最后是指向的adapter
先看错误代码

class HomeFragment : Fragment() {
    private var _binding: FragmentHomeBinding? = null
    private val binding get() = _binding!!
    private var taskAdapter: TaskAdapter? = null

    private var tasks = mutableListOf<String>()
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        loadTask()
        observeData()
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        initView()
    }

    private fun loadTask() {}
    private fun observeData() {}
    private fun initView() {
        taskAdapter = TaskAdapter()
        binding.homeTaskList.layoutManager = GridLayoutManager(requireContext(), 3)
        binding.homeTaskList.adapter =   taskAdapter?.apply {
            isAnimationFirstOnly = false
            setAnimationWithDefault(BaseQuickAdapter.AnimationType.ScaleIn)
            setOnItemClickListener { _, _, position ->
                findNavController().navigate(HomeFragmentDirections.actionHomeToCollect(position))
            }
        }
 
            taskAdapter?.setList(tasks)
    }


    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

错误原因分析:
因为上一篇博文写的经历,我首先想到的是,页面跳转的时候,fragment 对象还在,但是View被回收,估计是有哪个View的引用被Fragment持有了,销毁不掉造成的,然后来看一下泄漏描述,最后
在这里插入图片描述
recyclerViewOrNull是我的Adapter 继承得来的
而recyclerViewOrNull 源码中是这样的
在这里插入图片描述
那就很直观了 这就是关联的哪个RecyclerView
和一开始猜的一样Adapter持有了RecyclerView,界面跳转,RecyclerView销毁,Adapter持有、销毁不了,然后内存泄漏,那就简单了
解决方法就是在onDestroyView 加一个置为null就可以了

   override fun onDestroyView() {
        super.onDestroyView()
        taskAdapter = null
        _binding = null
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值