ContentProvider线程

时间:2012-03-06 08:35:38

标签: android multithreading android-contentprovider

好奇。

getContentResolver().query(...)

我知道Loaders在后台线程上运行查询。这是否也适用于插入,更新和删除?我应该为这些类型的调用创建AsyncTasks,Threads等吗? 大型更新可能会阻止我的应用程序的主线程。

getContentResolver().insert(...)

谢谢!

3 个答案:

答案 0 :(得分:5)

来自Content Provider Basics

  

从提供商处检索数据

     

本节介绍如何使用提供程序从提供程序检索数据   以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类。