內(nèi)容復(fù)制自 Android ContentProvider 完全解析及DEMO(最具說服力)颊乘,在此致謝!
面試題:多個進程同時調(diào)用一個 ContentProvider 的 query 獲取數(shù)據(jù)宁炫,ContentPrvoider 是如何反應(yīng)的呢?
標(biāo)準(zhǔn)答案:一個 ContentProvider 可以接受來自另外一個進程的數(shù)據(jù)請求击吱。盡管 ContentResolver 與 ContentProvider 類隱藏了實現(xiàn)細(xì)節(jié)淋淀,但是 ContentProvider 所提供的 query()遥昧,insert()覆醇,delete()朵纷,update() 都是在 ContentProvider 進程的線程池中被調(diào)用執(zhí)行的,而不是進程的主線程中永脓。這個線程池是由 Binder 創(chuàng)建和維護的袍辞,其實使用的就是每個應(yīng)用進程中的 Binder 線程池。
面試題:你覺得 Android 設(shè)計 ContentProvider 的目的是什么呢常摧?
標(biāo)準(zhǔn)答案:
- 隱藏數(shù)據(jù)的實現(xiàn)方式搅吁,對外提供統(tǒng)一的數(shù)據(jù)訪問接口;
- 更好的數(shù)據(jù)訪問權(quán)限管理落午。ContentProvider 可以對開發(fā)的數(shù)據(jù)進行權(quán)限設(shè)置谎懦,不同的 URI 可以對應(yīng)不同的權(quán)限,只有符合權(quán)限要求的組件才能訪問到 ContentProvider 的具體操作溃斋。
- ContentProvider 封裝了跨進程共享的邏輯界拦,我們只需要 Uri 即可訪問數(shù)據(jù)。由系統(tǒng)來管理 ContentProvider 的創(chuàng)建梗劫、生命周期及訪問的線程分配享甸,簡化我們在應(yīng)用間共享數(shù)據(jù)(進程間通信)的方式。我們只管通過 ContentResolver 訪問 ContentProvider 所提示的數(shù)據(jù)接口梳侨,而不需要擔(dān)心它所在進程是啟動還是未啟動蛉威。
面試題:運行在主線程的 ContentProvider 為什么不會影響主線程的UI操作?
標(biāo)準(zhǔn)答案:
ContentProvider 的 onCreate() 是運行在 UI 線程的,而 query()走哺,insert()蚯嫌,delete(),update() 是運行在線程池中的工作線程的丙躏,所以調(diào)用這四個方法并不會阻塞 ContentProvider 所在進程的主線程齐帚,但可能會阻塞調(diào)用者所在的進程的 UI 線程!
所以彼哼,調(diào)用 ContentProvider 的操作仍然要放在子線程中去做对妄。雖然直接的 CRUD 的操作是在工作線程的,但系統(tǒng)會讓你的調(diào)用線程等待這個異步的操作完成敢朱,你才可以繼續(xù)線程之前的工作剪菱。