如果我从 Activity 调用 ContentProvider,ContentProvider 运行在哪个线程中?
例如,如果 Activity 被杀死并且在 ContentProvider 中执行查询,会发生什么?假设您的网络查询速度较慢 f.ex。
如果我从 Activity 调用 ContentProvider,ContentProvider 运行在哪个线程中?
例如,如果 Activity 被杀死并且在 ContentProvider 中执行查询,会发生什么?假设您的网络查询速度较慢 f.ex。
如果您的意思是使用 ContentResolver 调用 ContentProvider 的正常用例,那么据我所知,这就是发生的情况:
在此示例中,我假设您的 ContentProvider 位于一个进程中,而您的 Activity 位于另一个进程中。
如果尚未创建 ContentProvider,则使用应用程序进程的“主”线程调用 onCreate() 方法。
使用 BinderThreads 调用 query()/insert()/update()/delete() 方法,BinderThreads 位于每个应用程序进程中,等待来自其他进程的传入命令。
那么如果触发 query()/insert()/etc 的 Activity 在这些方法调用之一的中间被杀死会发生什么?我不能肯定地说,但我相当有信心 ContentProvider 中发生的任何事情都会继续,因为 ContentProvider 进程应该不受影响,但是在该方法返回后会发生什么我不能肯定地说。
除非您的内容提供商由网络而不是通常的 sqlite db 支持,否则我不确定这将如何涉及慢速网络?
澄清:
调用 ContentProvider 函数时有两种可能性(查询/插入/更新/删除/等):
您的 ContentProvider 与调用者处于同一进程中。如果是这样,ContentProvider 函数将在与调用者相同的线程上同步运行。
您的 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/guide/components/processes-and-threads.html
我在解决同一应用程序中的远程进程(UI 除外)每次运行查询时都会不断生成内容提供程序的问题时偶然发现了这一点。不幸的是,除非您编写自定义内容,否则只要进程正在运行, ContentProviders 就永远不会被销毁。内容提供者通常在 UI 进程线程(未打开)中运行,因此在这种远程进程查询内容提供者的情况下,它会在每次查询时生成一个新的内容提供者实例,因为该单独的进程(UI 线程)是当时没有运行。
也许有更好的方法可以做到这一点,但是我没有花费大量精力滚动我自己的数据库或内容提供程序来关闭每次创建时的数据库和资源,而是发现了一个简单的解决方法。
事实证明,它具有与服务相同的在单独进程中运行的能力。因此,在我的示例中,我只是将内容提供程序移动到远程服务所在的同一进程。问题已解决,现在内容提供程序在同一进程中运行,并且只要服务正在运行,就只会产生一次。还要检查android:multiprocess 属性。