Fragment中RecyclerView初始化卡顿:如何避免阻塞主线程渲染?
解决Fragment中RecyclerView初始化卡顿的方案
卡顿的核心原因不是代码放在onCreateView或onViewCreated里,而是数据转换(SourcesReference.shopData.toList())和过滤(updateFiltered())操作在主线程执行,阻塞了UI渲染流程。以下是具体优化方案:
1. 异步处理耗时数据逻辑
把数据转换、过滤这类耗时操作放到IO线程执行,完成后再切回主线程绑定RecyclerView:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val recyclerView = view.findViewById<RecyclerView>(R.id.shop_recycler) // 先设置布局管理器(轻量操作,可直接在主线程完成) recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) // 用viewLifecycleOwner的协程作用域,避免内存泄漏 viewLifecycleOwner.lifecycleScope.launch { val preparedAdapter = withContext(Dispatchers.IO) { // IO线程处理数据 val shopDataList = SourcesReference.shopData.toList() SourcesShopAdapter().apply { dataset = shopDataList updateFiltered() // 把过滤逻辑放在IO线程执行 } } // 主线程绑定适配器 recyclerView.adapter = preparedAdapter } }
2. 视图绘制完成后执行(辅助优化)
如果还有少量主线程轻量操作需要延迟,可通过view.post让代码在视图绘制完成后执行,避免抢占渲染资源:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val recyclerView = view.findViewById<RecyclerView>(R.id.shop_recycler) recyclerView.post { recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) { val shopDataList = SourcesReference.shopData.toList() val adapter = SourcesShopAdapter().apply { dataset = shopDataList updateFiltered() } withContext(Dispatchers.Main) { recyclerView.adapter = adapter } } } }
3. 优化适配器内部逻辑
检查SourcesShopAdapter的updateFiltered方法,如果包含循环遍历、复杂计算等操作,确保这些逻辑不会在主线程执行;同时避免在适配器初始化时做不必要的对象创建或资源加载。
内容的提问来源于stack exchange,提问作者Nikitiy
相关产品推荐
相关产品推荐

