Android在UI线程上使用游标

3
我在想什么时候或是否可以使用光标从UI线程获取SQLite数据库中的数据。基本上,我使用CursorLoader来获取游标,然后我想对该游标进行一些操作。从主UI线程操作游标是否正确?实际上,我只需要读取游标中的一行。
2个回答

3
Cursor 中检索一行并不是一个昂贵的操作...另一方面,从数据库查询数据可能会非常耗时,这取决于您请求的数据量和/或查询的复杂性。 CursorLoader 异步查询 Cursor,因此您的方法是可行的。

4
顺便提醒一下,如果你的查询结果包含大量的数据(许多列和/或行),游标窗口将无法容纳整个查询结果。每当你尝试将光标位置移动到游标窗口之外时,都会发生新的文件访问以重新填充游标窗口。当在装有数千张图片/视频的设备上查询MediaProvider时进行大规模投影,很容易发生这种情况。 - Mattias

-2

没问题。这不是一个网络操作。

编辑:我所说的“没问题”是指Android 4.x不会因为在主线程上执行此操作而强制关闭您的应用程序,就像执行网络I/O一样。根据查询时间,将UI线程停顿可能适合或不适合。对于“通过其主键从单个表中获取单个行”的查询,这是完全可以的。对于需要一秒钟或更长时间的复杂查询,请考虑使用后台线程和进度对话框。


好的,所以只要不是来自网络,那就没问题了?你觉得为什么有人会放置 -1 呢? - MobDev
@user1486574 我之所以使用-1,是因为即使对本地SQLite数据库进行查询,也应该异步执行,因为你不知道它们需要多长时间。磁盘读取/写入同样如此。网络操作绝对不是滥用UI线程的唯一方式。 - Alex Lockwood
接下来,要为检索偏好设置创建一个线程?嘿,这也涉及到磁盘I/O!真正的答案是没有一个单一的正确答案。我可以想到一些在主线程中可以接受的查询,也有一些明显不行的。但至少NetworkOnMainThreadException不需要担心。 - Seva Alekseyev
我同意SharedPreferences很容易检索,而且在UI线程上执行也没问题。但最好异步地写入SharedPreferences。自API 9以来,Android SDK提供了可以这样做的方法(Editor#commit)。您还可以使用Mark Murphy(CommonsWare)的SharedPreferenceLoaderhere。就像您所说,“查询单个行”是可以的,但很多时候您不想冒险,因为即使停顿几百分之一秒也会降低用户体验。 - Alex Lockwood
显示进度UI和启动线程也不是免费的。单独启动一个线程需要几百分之一秒的时间,从而进一步降低用户体验。更糟糕的是 - 与主线程停滞50毫秒延迟还是带有漂亮的“请稍候”窗口200毫秒延迟? - Seva Alekseyev
这完全涉及到可能阻塞主线程。当你尝试向数据库查询一点点内容时,你永远不知道其他进程对文件系统会做什么。自从donut和eclair以来我一直在开发应用程序,我发现即使是看似最无辜的.query()或文件操作也会导致ANR。 - Mattias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接