如何使用 ROOM 库在不阻塞 UI 的情况下将数千条记录从本地数据库加载到 recyclerview

Posted

技术标签:

【中文标题】如何使用 ROOM 库在不阻塞 UI 的情况下将数千条记录从本地数据库加载到 recyclerview【英文标题】:How to load thousands of records from local database to recyclerview without blocking UI using ROOM library 【发布时间】:2021-10-01 02:59:52 【问题描述】:

我正在使用本地数据库在 recyclerview 上加载记录,问题是记录的大小约为 6000,当我点击打开或在 recyclerview 中显示这些记录时,我的设备卡住了几秒钟,出现一个空白屏幕,当很少秒过它出现并显示记录。有没有办法在不阻塞 UI 的情况下在 recyclerview 上加载数千条记录或数据?请告诉我谢谢

【问题讨论】:

使用分页库developer.android.com/reference/android/arch/paging/… 【参考方案1】:

将此方法复制并粘贴到您的 Activity / Baseactivity。并在yourRecyclerview.setAdapter(YourAdapter)之后调用它

public void PagginationRecyclerView(RecyclerView rv) 
   rv.addOnScrollListener(new RecyclerView.OnScrollListener() 
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) 
            super.onScrolled(recyclerView, dx, dy);

            LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
            int total = layoutManager.getItemCount();
            int currentLastItem = layoutManager.findLastVisibleItemPosition();
            if (currentLastItem == total - 1) 
                Toast.makeText(BaseActivity.this, "Load Next", Toast.LENGTH_SHORT).show();
                // Request to Database to load more data
            
        
    );

【讨论】:

只有当滚动到你的recyclerview中的最后一个-1可见项目时,这个方法才会从db重新加载更多数据。 (您必须修改和替换 toast 消息)。还有另一个可用的库,称为 SwipeToRefresh,您可以在 github 上找到它。如果对您有帮助,请通过投票来应用。 您能否也分享一下sqlite查询以一次加载有限数量的记录! 更好地加载有限的数据(假设 50 行或来自 db 的条目)并显示。然后再次加载接下来的 50 个条目。 ⚠️ 加载整个数据会影响应用程序的速度,也会造成内存问题。 我希望我可以分享您的问题的源代码,但不幸的是我现在没有。

以上是关于如何使用 ROOM 库在不阻塞 UI 的情况下将数千条记录从本地数据库加载到 recyclerview的主要内容,如果未能解决你的问题,请参考以下文章

在不启动接收活动的情况下将数据传递给活动 (Android)

如何以非阻塞方式链接期货?也就是说,如何在不阻塞的情况下将一个future用作另一个future的输入?

如何在不使用 C++/C 中的阻塞函数的情况下将值从线程返回到主函数

我们是不是可以在不使用 Datepicker 的情况下将材质 UI 选择器中的 Calendar 组件用作独立组件 - 如果可以,如何?

在不需要 URL 参数的情况下将 props 传递给路由

如何在不使用界面生成器的情况下将视图与控制器分离