如何使用 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 组件用作独立组件 - 如果可以,如何?