Android4.4 Telephony流程分析――聯系人(Contact)列表縮略圖的加載過程
來源:程序員人生 發布時間:2014-12-15 09:22:48 閱讀次數:4341次
本文代碼以MTK平臺Android 4.4.2為分析對象,與Google原生AOSP有些許差異,請讀者知悉。
Android聯系人列表的縮略圖加載主要用到ContactPhotoManager.java這個類,這是個抽象類,實現了ComponentCallbacks2接口,其內部有個它的具體實現類,叫ContactPhotoManagerImpl,ContactPhotoManagerImpl繼承了ContactPhotoManager并實現了android.os.Handler.Callback接口,里面主要用了預加載、異步查詢和兩個LruCache緩存對象(mBitmapHolderCache和mBitmapCache)來提升縮略圖的顯示速度,關于LruCache類的使用,可查看Android官方文檔Caching
Bitmaps或中文翻譯版。本文主要了解縮略圖的預加載(Contact.apk啟動時就開始加載,準確的說是聯系人收藏頁面(ContactTileListFragment)加載時)、異步查詢進程(ListView顯示時使用getView()對縮略圖的加載進程與預加載類似)。

預加載進程主要是關注加載狀態的變化mPreloadStatus就比較容易理解,
private static final int PRELOAD_STATUS_NOT_STARTED = 0; //預加載還沒開始
private static final int PRELOAD_STATUS_IN_PROGRESS = 1; //預加載進行中
private static final int PRELOAD_STATUS_DONE = 2; //預加載完成
step16,queryPhotosForPreload()中查詢contact2.db的contact表,找到有縮略圖的聯系人的PHOTO_ID,預加載最多加載MAX_PHOTOS_TO_PRELOAD條,
/**
* Maximum number of photos to preload. If the cache size is 2Mb and
* the expected average size of a photo is 4kb, then this number should be 2Mb/4kb = 500.
*/
private static final int MAX_PHOTOS_TO_PRELOAD = 100;
將查詢到的PHOTO_ID放入預加載列表mPreloadPhotoIds中。
step19,
int preloadSize = mPreloadPhotoIds.size();
while (preloadSize > 0 && mPhotoIds.size() < PRELOAD_BATCH) {
preloadSize--;
count++;
Long photoId = mPreloadPhotoIds.get(preloadSize);
mPhotoIds.add(photoId);
mPhotoIdsAsStrings.add(photoId.toString());
mPreloadPhotoIds.remove(preloadSize);
}
給mPhotoIds和mPhotoIdsAsStrings賦值,規則情況源碼。
step20,loadThumbnails()中對會用到上面兩個集合,再次查詢Data表,將縮略圖查詢出來。step24會將縮略圖緩存到LruCache對象mBitmapHolderCache中。
心急下班,不說了。。。
右鍵復制圖片地址,在閱讀器中打開便可查看大圖。
未完待續,有不對的地方,請指正。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈