哪个线程运行ContentProvider?

时间:2010-08-16 08:53:10

标签: android android-contentprovider

如果我从一个Activity调用ContentProvider,哪个线程运行在ContentProvider中?

E.g。如果Activity被杀死并且在ContentProvider中执行查询会发生什么?假设您的网络查询速度很慢f.ex。

2 个答案:

答案 0 :(得分:21)

如果您的意思是使用ContentResolver来调用ContentProvider的正常用例,那么根据我的知识,这是发生的事情:

  1. 我假设在这个例子中,您的ContentProvider生活在一个进程中,而您的Activity生活在另一个进程中。

  2. 如果尚未创建ContentProvider,则使用应用程序进程的“主”线程调用onCreate()方法。

  3. 使用BinderThreads调用query()/ insert()/ update()/ delete()方法,BinderThreads位于每个等待来自其他进程的传入命令的应用程序进程中。

  4. 那么如果触发query()/ insert()/ etc的Activity在其中一个方法调用中被杀死,会发生什么?我不能肯定地说,但我相信ContentProvider中发生的任何事情都会继续,因为ContentProvider进程应该继续不受影响但是在该方法返回后会发生什么我无法确定。

    除非你的内容提供商是由网络而不是通常的sqlite数据库支持,否则我不确定慢速网络将如何参与其中?

    <强>澄清:

    调用ContentProvider函数(查询/插入/更新/删除/等)时有两种可能性:

    1. 您的ContentProvider与调用者处于同一进程中。如果是这样,ContentProvider函数在与调用者相同的线程上同步运行。

    2. 您的ContentProvider与调用者处于不同的进程中。如果是这样,ContentProvider函数在ContentProvider进程中的binder线程上运行。

    3. 在这两种情况下,调用者都会被阻塞,直到ContentProvider函数返回。一如既往地阅读Google和/或AOSP源代码的完整文档。

      http://developer.android.com/reference/android/content/ContentProvider.html http://developer.android.com/guide/topics/providers/content-provider-basics.html http://developer.android.com/guide/components/processes-and-threads.html

答案 1 :(得分:5)

我在解决同一应用程序中的远程进程(除了UI)每次运行查询时会不断产生内容提供程序的问题时偶然发现了这一点。不幸的是,除非您编写自定义内容,ContentProviders are never destroyed只要进程正在运行。内容提供程序通常在UI进程线程(未打开)中运行,因此在查询contentprovider的远程进程的情况下,它将在每个查询时生成contentprovider的新实例,因为该单独的进程(UI线程)是当时没跑。

也许有更好的方法可以做到这一点,但我没有花费大量精力rolling my own db or content provider关闭每个创建的数据库和资源,而是发现了一个简单的解决方法。

事实证明,它具有与服务一样在单独进程中运行的能力。因此,在我的示例中,我只是将内容提供程序移动到远程服务所在的同一进程。问题已解决,现在内容提供程序在同一进程中运行,只有在服务运行时才生成一次。另请查看android:multiprocess attribute