【问题标题】:How to run CoroutineScope in RecyclerViewCursorAdapter on ViewHolder inside bindCursor{ }如何在绑定游标{}内的 ViewHolder 上的 RecyclerView CursorAdapter 中运行 CoroutineS
【发布时间】:2021-06-14 11:39:24
【问题描述】:

注意:我已经在 RecyclerViewCursorAdapter 中实现了 Coroutine Single Scope,但是当我将其更改为 runBlocking 时应用程序变得太慢了,它工作正常

有什么方法可以在每次滚动时在 bindCursor{} 内的 ViewHolder 中执行 CoroutineScope 而不会影响性能? 我需要在每次滚动时从数据库中执行多个查询并相应地更新 UI。

【问题讨论】:

    标签: android android-recyclerview kotlin-coroutines coroutine simplecursoradapter


    【解决方案1】:

    我很确定,有比在适配器中做更好的方法来做你正在做的事情。我不认为这是正确的,也许您可​​以通过接口或其他方式使用回调。

    但是回到您的问题,您应该可以使用lifeCycleScope轻松做到这一点

    为每个 Lifecycle 对象定义一个 LifecycleScope。当生命周期被销毁时,在这个范围内启动的任何协程都会被取消。

    由于您没有提及您使用的是活动还是片段,但两者的逻辑和功能保持不变。我给你举个例子Fragment

    class MyFragment: Fragment() {
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            viewLifecycleOwner.lifecycleScope.launch {
                // Do stuff here
            }
        }
    }
    

    就像你可以启动协程,它会根据生命周期进行处理,你可能需要将viewLifeCycleOwner 传递给你的片段,虽然我说过不建议这样做,你最好使用排序接口然后在 Fragment 本身中进行计算,但您可以理解。

    【讨论】:

    • 其实整个项目都是基于MVP模式的。我有 Model、view、Presenter 和 table helper 类,我无法使用 viewModelScope 或生命周期范围
    • lifeCycleScope 在您的活动和片段中可用。我认为即使使用 MVP 模式,您也应该能够使用它。你不需要ViewModel
    • RecyclerViewCursorAdapter 在片段上初始化,但我已经提到我需要在滚动时的 bindview 内使用 RecyclerViewCursorAdapter 中的协程范围
    • 在初始化适配器时将 viewLifeCycleOwner 传递给适配器 @DanishKhan。同样,不推荐,但你可以做到。
    • 我对viewLifeCycleOwner不太了解,你能给我举个例子吗?如果可能,如何在 RecyclerViewCursorAdapter 中传递 viewLifeCycleOwner。
    猜你喜欢
    • 2021-11-23
    • 2021-01-17
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2019-09-16
    • 2019-01-07
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多