Android 面试5——ContentProvider

内容复制自 Android ContentProvider 完全解析及DEMO(最具说服力),在此致谢!

面试题:多个进程同时调用一个 ContentProvider 的 query 获取数据,ContentPrvoider 是如何反应的呢?

标准答案:一个 ContentProvider 可以接受来自另外一个进程的数据请求。尽管 ContentResolver 与 ContentProvider 类隐藏了实现细节,但是 ContentProvider 所提供的 query()insert()delete()update() 都是在 ContentProvider 进程的线程池中被调用执行的,而不是进程的主线程中。这个线程池是由 Binder 创建和维护的,其实使用的就是每个应用进程中的 Binder 线程池。


面试题:你觉得 Android 设计 ContentProvider 的目的是什么呢?

标准答案:

  1. 隐藏数据的实现方式,对外提供统一的数据访问接口;
  2. 更好的数据访问权限管理。ContentProvider 可以对开发的数据进行权限设置,不同的 URI 可以对应不同的权限,只有符合权限要求的组件才能访问到 ContentProvider 的具体操作。
  3. ContentProvider 封装了跨进程共享的逻辑,我们只需要 Uri 即可访问数据。由系统来管理 ContentProvider 的创建、生命周期及访问的线程分配,简化我们在应用间共享数据(进程间通信)的方式。我们只管通过 ContentResolver 访问 ContentProvider 所提示的数据接口,而不需要担心它所在进程是启动还是未启动。

面试题:运行在主线程的 ContentProvider 为什么不会影响主线程的UI操作?

标准答案:
ContentProvider 的 onCreate() 是运行在 UI 线程的,而 query()insert()delete()update() 是运行在线程池中的工作线程的,所以调用这四个方法并不会阻塞 ContentProvider 所在进程的主线程,但可能会阻塞调用者所在的进程的 UI 线程!
所以,调用 ContentProvider 的操作仍然要放在子线程中去做。虽然直接的 CRUD 的操作是在工作线程的,但系统会让你的调用线程等待这个异步的操作完成,你才可以继续线程之前的工作。

你可能感兴趣的:(Android 面试5——ContentProvider)