Android - SQLite ContentResolver在UI线程上插入/删除/更新?

Leo*_*o K 10 sqlite android ui-thread android-contentresolver sql-insert

我已经浏览了许多在Android中使用SQLite的示例/教程.比方说,你有使用SQLite,一个应用程序ContentProvider,CursorLoader一个自定义CursorAdapter.现在我发现的所有主要示例都依赖于a CursorLoader来获取数据CursorAdapter,这本质上CursorLoader是以Async-UI线程安全的方式发生的.然而,这些相同的例子都使插入/删除/更新通过调用ContentResolver在主线程(例如,从onClick,onResume,onPause).(示例)它们不会将这些调用包装在一个AsyncTask或启动一个单独的线程中或使用AsyncQueryHandler.为什么这样,如此多的写得好的博客/例子怎么会犯这么明显的错误呢?或者是简单的单行插入/删除/更新调用如此之快,以至于它们足以安全地从Main/UI线程启动?这些快速通话的正确方法是什么?

HC *_*ang 5

我还对样本在主线程上进行调用感到困惑。我猜这些示例只是简化了演示,避免了额外的线程和回调,因为单个插入/更新/删除调用可能很快返回。

除了用于查询的加载程序模式之外,android从API级别1开始,确实提供了一个帮助程序类AsyncQueryHandler,用于支持完整CRUD回调的异步CRUD操作。AsyncQueryHandler与HandlerThread一起用于异步操作,并将结果传递回主线程。

因此,我确实相信ContentProvider查询应该在UI之外的工作线程中运行,并且根据官方设计,这些示例可能不是最佳实践。

===编辑

发现从官方文档框架的注释,请参阅,255线:

In practice, this should be done in an asynchronous thread instead of
on the main thread. For more discussion, see Loaders. If you are not
just reading data but modifying it, see {@link android.content.AsyncQueryHandler}.
Run Code Online (Sandbox Code Playgroud)

===编辑2 链接到包含上述报价的实际android开发指南