讀古今文學網 > Android程序設計:第2版 > Android MVC和內容查看器 >

Android MVC和內容查看器

從較高的視角充分理解Android中MVC和內容提供者如何一起協同工作是非常重要的。此外,在Android中關於MVC的更詳細的探討將在P345「Network MVC」一節中進行。

為了理解內容提供者框架的功能,需要先弄清楚游標更新事件是如何驅動Android UI動態更新的。這裡有必要對在傳統的MVC編程模式中經常被忽略的通信模式進行重點強調,這個過程中具體執行了如下動作:視圖把用戶輸入事件傳遞給控制器;控制器修改模型;模型把更新事件發送給視圖及在模型中註冊了的所有觀察器;視圖渲染模型中的內容,通常不需要應用邏輯的直接參與,理想情況下只需要對模型中的數據進行迭代。

在Android中,MVC模式的工作原理如圖12-3所示,其中:

·模型部分包括內容提供者和query方法所返回的光標,以及SQLite數據庫表中所存儲的數據。

·在實現上,當內容提供者調用ContentResolver.notifyChange方法修改數據時,應該發送事件通知。因為提供者修改數據只有一種方式,只要數據發生變化,它都能知道。

·事件通知發送給UI組件,通常是ListView,通過觀察綁定在內容提供者URI的Cursor對像來進行。在響應提供者的notifyChange方法被調用時,cursor把模型中的消息更新給視圖。視圖和Android活動及其視圖相對應,與控制器對應的則是監聽它們生成的事件的類。具體而言,系統會發送ContentObserver.onChange消息給使用Cursor.registerContentObserver註冊過的ContentObserver實例。當開發人員調用ListView.setAdapter(ListAdapter)方法時,Android類會自動註冊游標變化。列表視圖中包含了內部的內容觀察器,列表適配器會註冊Cursor對象。

假定有個活動要調用ContentResolver.delete方法,我們一起來看看這個通知機制實際上是如何工作的。首先,相應的內容提供者會從數據庫中刪除一條記錄,然後通知該記錄對應的解析程序URI。在視圖中嵌入的所有監聽游標會接到數據變化通知;視圖會順序接收到更新事件,並重新繪製以反映新的狀態。視圖會繪製其顯示區域的任何狀態;如果它包含要刪除的元素,該元素會從UI中消失。Cursor對象是作為光標使用方和內容提供者系統之間的代理對象,事件從提供者通過光標流向視圖系統。該事件序列的自動化可以給開發人員帶來很大的便利,他們只需要編寫很少的代碼就可以運行。此外,程序不需要顯式輪詢就可以保持模型在渲染時是最新的,因為當狀態改變時,模型會通知視圖。

圖12-3:在Android MVC中典型的光標和內容提供者的使用方式