程序员人生 网站导航

Android4.4 Telephony流程分析――联系人(Contact)列表缩略图的加载过程

栏目:综合技术时间:2014-12-15 09:22:48

本文代码以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中。


心急下班,不说了。。。



右键复制图片地址,在阅读器中打开便可查看大图。

未完待续,有不对的地方,请指正。



------分隔线----------------------------
------分隔线----------------------------

最新技术推荐