好奇。
getContentResolver().query(...)
我知道Loaders在后台线程上运行查询。这是否也适用于插入,更新和删除?我应该为这些类型的调用创建AsyncTasks,Threads等吗? 大型更新可能会阻止我的应用程序的主线程。
getContentResolver().insert(...)
谢谢!
答案 0 :(得分:5)
从提供商处检索数据
本节介绍如何使用提供程序从提供程序检索数据 以User Dictionary Provider为例。
为了清楚起见,本节中的代码片段为call “UI线程”上的ContentResolver.query()。但是,在实际代码中, 你应该在一个单独的线程上异步进行查询。一种方法 这是使用CursorLoader类,更多描述 装载机指南中的详细信息。此外,代码行是片段 只要;它们没有显示完整的应用程序。
答案 1 :(得分:2)
Loaders仅适用于查询,即在“活动”或“片段”中加载数据,而不是插入/更新/删除。
除了Loader,从Android 3.0开始提供,android确实提供了一个帮助类AsyncQueryHandler,因为API级别1,用于支持完整CRUD回调的异步CRUD操作。
AsyncQueryHandler在内部使用HandlerThread进行异步操作,并将结果传递回主线程。使用AsyncTask或简单的工作线程也是特殊要求方面的流行做法。
答案 2 :(得分:1)
当你说Loaders在后台线程上运行查询时,你需要了解它是在后台线程中执行查询的Loader类的实现。
这样做的结果是您将要使用或扩展并实现抽象Loader类的子类,而不是使用AsyncTask或Java线程。原因是当您创建Loader时,它希望您返回Loader类型的实例。 java线程或AsyncTask不能用于此目的。 Loader类的子类通过启动自己的线程来完成此操作。客户端类或创建Loader的类仅初始化Loader。实际的Loader实例可以执行您希望它执行的任何操作。这可以是任何东西 - 插入,更新,删除等.Android提供的CursorLoader实现以异步方式从后台线程中的表查询数据并返回结果集。 Android不提供用于插入或更新数据的类似本机实现。你所拥有的是从AsyncTaskLoader扩展的选项(CursorLoader继承的同一个类)。
另外,请记住,Loaders用于优化数据库访问,因此只有在完成任务时才会将结果发布到主线程,而不是在此之前(有一个hack类似的解决方法来发布更新到UI线程,但这打破了范式)。装载机只关心完成他们的工作,并且不想提供任何更新。
如果您只是想异步处理ContentProvider查询,可能需要考虑使用Android提供的AsyncQueryHandler类。