哪个线程运行ContentProvider?

Tor*_* Bø 19 android android-contentprovider

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

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

sat*_*ine 21

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

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

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

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

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

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

澄清:

调用ContentProvider函数(query/insert/update/delete/etc)时有两种可能性:

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

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

在这两种情况下,调用者都会被阻塞,直到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 /引导/组件/过程和- threads.html


log*_*ray 5

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

也许有一种更好的方法可以做到这一点,但我没有花费大量精力在我自己的数据库或内容提供商上关闭每个创建的数据库和资源,而是发现了一个简单的解决方法.

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

  • "ContentProviders永远不会被破坏" - 它是在文档中吗?如果没有,请不要依赖它. (2认同)