Skip to content

关于submitList异步崩溃问题 #6819

@Suma-sun

Description

@Suma-sun
  1. io.github.cymchad是v4.1.2版本,androidx.recyclerview是v1.4.0
  2. 具体业务场景是首页通过ViewPager2有多个Fragment,Fragment里面又有ViewPager2带列表Fragment若干个,因为存在内存泄露所以在onDestroyView的时候手动onDetachedFromRecyclerView。通过ViewModel提供Flow给页面收集数据更新(数据接的Socket更新,存在200ms内更新一次数据,甚至可能更短间隔)。在偶现场景下Differ的listener触发了recyclerView.scrollToPosition(0),因为获取不到recyclerView崩溃。
  3. 代码使用
    onDestroyView用的扩展方法fun com.chad.library.adapter4.BaseQuickAdapter<*, >.onDestroyView(recyclerView: RecyclerView) {
    recyclerView.itemAnimator?.endAnimations()
    recyclerView.itemAnimator = null
    recyclerView.adapter = null
    this.onDetachedFromRecyclerView(recyclerView)
    }
    在数据更新时用的扩展方法fun com.chad.library.adapter4.BaseDifferAdapter<T,
    >.safeSubmitList(list: List?):Boolean {
    try {
    recyclerView
    submitList(list,null)//这里面会notify=>onChange=>...到mListener,可能会触发到recycler
    } catch (e: Exception) {
    DebugLog.e(ADAPTER_TAG,e)
    return false
    }
    return true
    }
    收集数据是viewLifecycleOwner.lifecycleScope.launch {
    viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
    viewModel.eventFlow.collect {
    when (it) {
    is PositionListEvent.ListUpdateEvent -> adapter.safeSubmit(it.list)
    //...
    }
    }
    }
    }
  4. crash日志
    IllegalStateException
    Please get it after onAttachedToRecyclerView()

com.chad.library.adapter4.BaseQuickAdapter in getRecyclerView at line 52
com.chad.library.adapter4.BaseDifferAdapter in mListener$lambda$0 at line 39
com.chad.library.adapter4.BaseDifferAdapter in $r8$lambda$NNJ550nlycriUe3RxDcTU3szqrE
com.chad.library.adapter4.BaseDifferAdapter$$ExternalSyntheticLambda0 in onCurrentListChanged
androidx.recyclerview.widget.AsyncListDiffer in onCurrentListChanged at line 376
androidx.recyclerview.widget.AsyncListDiffer in latchList at line 369
androidx.recyclerview.widget.AsyncListDiffer$1$2 in run at line 351
android.os.Handler in handleCallback at line 959
android.os.Handler in dispatchMessage at line 100
android.os.Looper in loopOnce at line 257
android.os.Looper in loop at line 342
android.app.ActivityThread in main at line 9634
java.lang.reflect.Method in invoke
com.android.internal.os.RuntimeInit$MethodAndArgsCaller in run at line 619
com.android.internal.os.ZygoteInit in main at line 929

5.我看了最新4.3.3的代码BaseQuickAdapter内的mDiffer仍然是会存在这个问题,没有提供规避该问题的外部手段

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions