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

例如。如果Activity被杀死并且在ContentProvider中执行查询会怎样?假设您的网络查询f.ex速度很慢。

最佳答案

如果您的意思是使用ContentResolver调用ContentProvider的正常用例,那么根据我所知,以下是发生的情况:

  • 在此示例中,我假设您的ContentProvider位于一个进程中,而您的Activity位于另一个进程中。
  • 如果尚未创建ContentProvider,则使用应用程序进程的“主”线程来调用onCreate()方法。
  • 使用BinderThreads调用query()/insert()/update()/delete()方法,该方法位于每个应用程序进程中,等待来自其他进程的传入命令。

  • 那么,如果触发query()/insert()/etc的Activity在这些方法调用之一的中间被杀死,会发生什么呢?我不能肯定地说,但我非常有信心ContentProvider中发生的任何事情都会继续,因为ContentProvider进程应该继续进行,但该方法返回后发生的事情我不确定。

    我不确定除非您的内容提供商是由网络而不是通常的sqlite db支持的,否则根本不会涉及到慢速网络吗?

    说明:

    调用ContentProvider函数时有两种可能性(查询/插入/更新/删除/等):
  • 您的ContentProvider与调用方的过程相同。如果是这样,ContentProvider函数将在与调用方相同的线程上同步运行。
  • 您的ContentProvider与调用者的处理过程不同。如果是这样,则ContentProvider函数将在ContentProvider进程中的绑定(bind)线程上运行。

  • 在这两种情况下,都将阻止调用方,直到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

    关于android - 哪个线程运行ContentProvider?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3491747/

    10-11 15:06