为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Room 的 Android 应用中的 PagedList 正在增长但从未缩小

使用 Room 的 Android 应用中的 PagedList 正在增长但从未缩小

qq_笑_17 2021-10-28 17:13:46
在我的 Android 应用程序中,我有一个非常基本的RecyclerView实现,它使用带有分页库的Room来显示数据库中的条目。从数据库中获取条目的 Dao 方法:@Query("SELECT * FROM entries")abstract fun findAll(): DataSource.Factory<Int, Entry>这就是LiveData从DataSource.Factorymy 中返回的构造方法ViewModel:private val config = PagedList.Config.Builder()        .setEnablePlaceholders(false)        .setInitialLoadSizeHint(512)        .setPrefetchDistance(256)        .setPageSize(256)        .build()val entries = LivePagedListBuilder(entryService.findAll(), config).build()// (entryService here just calls through to the Dao)我只是对此进行观察LiveData并将更新的内容传递PagedList给我的RecyclerView.Adapter.相应的RecyclerView.Adapter片段:private val differ = AsyncPagedListDiffer<Entry>(this, DIFF_CALLBACK)fun submitList(list: PagedList<Entry>) {    differ.submitList(list)}(我不使用PagedListAdapter,因为稍后我将需要在我的适配器中进行更细粒度的控制)看起来一切正常,但是当我开始监视应用程序的内存使用情况时,我开始怀疑这些PagedList项目没有得到正确处理。我已经添加了下面Callback的submitList():list.addWeakCallback(differ.currentList?.snapshot(), object : PagedList.Callback() {    override fun onChanged(position: Int, count: Int) {        Log.d("_tag", "Position: $position | Changed: $count" +                " | Size: ${list.size}")    }    override fun onInserted(position: Int, count: Int) {        Log.d("_tag", "Position: $position | Inserted: $count" +                " | Size: ${list.size}")    }    override fun onRemoved(position: Int, count: Int) {        Log.d("_tag", "Position: $position | Removed: $count" +                " | Size: ${list.size}")    }})在此之后,我向数据库中插入了 5 000 个条目,相应的日志条目如下:D/_tag: 位置: 0 | 插入:512 | 尺寸:512这很好,这是预期的输出。但是当我开始在列表中向下滚动时,日志条目如下:D/_tag: 位置: 512 | 插入:256 | 尺寸:768D/_tag: 位置: 768 | 插入:256 | 尺寸:1024D/_tag:位置:1024 | 插入:256 | 尺寸:1280D/_tag:位置:1280 | 插入:256 | 尺寸:1536然后日志停在这里,不再有日志条目,无论我在此之后向下滚动多少。我对这种行为的问题:为什么onRemoved()从不调用?是PagedList一个不断增长的列表并且项目留在内存中吗?分页的目的不是按需加载新条目并删除旧的(不可见的)条目吗?为什么日志在第 1536 个条目后停止,即使我滚动通过该条目?奇怪的是,即使滚动到列表底部,条目也能正确显示。如果有人能向我解释这种行为,我将不胜感激。
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

Android 架构组件团队的 Chris Craik 刚刚在Reddit上确认,到目前为止,Paging 库不会删除分页数据(但它即将到来):

它已合并(12),但由于在 AndroidX 切换期间格外小心,我们尚未发布。Arch 必须小心避免在 AndroidX 迁移期间导致回归(因为这些迁移足够复杂)。

现在 AndroidX 已经稳定了,我们可以发布了,所以我们很快就会看到它的发布。


查看完整回答
反对 回复 2021-10-28
  • 1 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信