哪个线程运行ContentProvider?

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

例如,如果活动在ContentProvider中被终止并且查询正在执行,会发生什么情况? 说你有一个慢速的networking查询f.ex。

Solutions Collecting From Web of "哪个线程运行ContentProvider?"

如果您的意思是使用ContentResolver调用ContentProvider的正常使用情况,那么根据我所知的最佳情况是:

  1. 我假设在这个例子中,你的ContentProvider存在于一个进程中,而你的Activity在另一个进程中。

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

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

那么如果触发query()/ insert()/ etc的Activity在这些方法调用的中间被终止,会发生什么呢? 我不能肯定地说,但我相当确信,ContentProvider中发生的任何事情都将继续,因为ContentProvider进程应该不受影响,但在该方法返回后会发生什么,我不能肯定地说。

我不知道一个缓慢的networking将如何介入,除非你的内容提供商是由networking而不是通常的sqlite数据库支持?

澄清:

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

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

  2. 您的ContentProvider与调用者位于不同的进程中。 如果是这样的话,ContentProvider函数在ContentProvider进程的一个绑定线程上运行。

在这两种情况下,调用者都被阻塞,直到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

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

也许有更好的方法来做这件事,但我没有花费大量的精力来滚动我自己的数据库或内容提供者来closures每个创build的数据库和资源,我发现了一个简单的解决方法。

事实certificate,和服务一样,在一个独立的进程中运行的能力是相同的。 所以在我的例子中,我只是将内容提供者移到了远程服务所在的同一个进程。 问题解决了,现在内容提供者运行在相同的进程中,只有在服务运行时才会产生一次。 另外检查一下android:multiprocess属性 。