【发布时间】:2015-01-29 17:53:59
【问题描述】:
该应用在 SQLite 数据库中有数据。 UI 主要是一个 RecyclerView。问题是如何最好地将数据从数据库传输到 UI,同时避开主线程?
我最初计划使用 CursorLoader、ContentProvider 和 RecyclerView。但是仔细阅读它看起来 RecyclerView 没有对 Cursor 提供的数据的开箱即用支持。当当。
这给我留下了一些其他的选择......
AsyncTask 加载数据,放入模型对象,并传入 RecyclerView Adapter。除了丑陋之外,它对配置更改不友好。
从 SQL 加载数据并将其推送到模型对象中的自定义加载程序。
使用游标加载器,当它返回游标时,遍历它以将数据推送到模型对象中。我怀疑这会发生在主线程上并可能会损害性能。
使用Otto发送请求消息请求数据,然后通过返回消息返回模型对象集合。可能有大约 500 个对象,所以我想我可能宁愿滥用 Otto 这样做。
如果我使用模型对象集合而不是游标,我会发现 ContentProvider 的好处较少,并且我也失去了 UI 自动刷新数据更改的能力(这可能很有用)。
这些选项都不吸引人,有更好的方法吗?该应用程序面临时间压力,因此无论它是什么都需要相当快地实施。不幸的是,UI 需要水平滚动并且只针对 Lollipop,所以 RecyclerView 似乎比 ListView 更好。
【问题讨论】:
-
我在我的一个应用程序中使用方法 3,并在 onLoadFinished 中生成一个新线程,从数据中创建模型对象。这个方法我还没遇到过问题
-
见gist.github.com/Shywim/127f207e7248fe48400b,请不要在光标上迭代,它没有什么意义,正如你所说,它会降低性能
-
你不能把光标移到另一个任务中吗?当然仍然不可取。
-
@G_V 的问题是游标可以在你完成循环之前被加载器关闭
-
@pskink 您的回复和指向适配器代码的指针使我的项目代码运行良好 - 代码简单,易于阅读,脱离主线程,用户界面非常流畅。随时发表您的评论作为答案,我会接受。
标签: android android-sqlite android-contentprovider android-recyclerview android-cursorloader