Android平台Gallery2应用分析(五)---AlbumPage和DataManager

AlbumPage

AlbumPage的代码流程类似于AlbumSetPage。详细流程图这里就不做详细绘制了。下面列出关键成员:


由于代码流程和AlbumSetPage类似,这里不做特别说明,下面主要对DataManager如何管理数据做分析。
从BitmapLoader(如AlbumSetPage中的AlbumCoverLoader、AlbumLabelLoader以及AlbumPage中的ThumbnailLoader)调用submitBitmapTask到onLoadComplete得到Bitmap,Bitmap的获取和mItem.requestImage有关,返回一个Job<Bitmap>。mItem是MediaItem类型,初始化是在构造函数中,从前面流程图看出在prepareSlotContent创建ThumbnailLoader时,item由mSource.get(slotIndex)获得。而mSource是AlbumDataLoader类型,get获取自MediaItem[] mData, mData也是在构造函数中赋值的。经跟踪,原来mData是DataManager中getMediaSet根据路径得到,将思路理一下,让我们了解下DataManager如何管理数据:
1) GalleryAppImpl.java中getDataManager()获取一个DataManager单例,并在首次初始化时initializeSourceMap()。这个函数引出了DataManager中一个很重要的HashMap mSourceMap,在其中加入了LocalSource、PicasaSource、ComboSource等,都按前缀加入HashMap,如LocalSource前缀为“local”。
2) AlbumPage.java中initializeData中由mActivity.getDataManager()就是从GalleryAppImpl中获取DataManager实例,而getMediaSet(mMediaSetPath)从代码看,就是从AlbumPage掉漆AlbumPage时Bundle对象中存入的。从抓起的Log看,这个路径类似:“/local/all/…”。
3) DataManager.java中的getMediaSet(…)。先由mSourceMap.get(Path.getPrefix())获取到MediaSource对象,从以上对照分析,不难知道本地图片MediaSource对象为LocalSource。再由source.createMediaObject(Path)得到MediaObject.object。同样能,到LocalSource代码中找createMediaObject(…)。这里用了PathMatcher来匹配LocalSource创建时由mMatcher加入的值,从Path值知道,我们得到的LocalAlbum对象。
(UriMatcher和PathMatcher是Android提供的两种匹配Uri的类,用法参考developer官网)
4) AlbumPage.onResume() -> mAlbumDataAdapter.resume()。其中ReloadTask()来获取每项MediaItem的内容,得到之后再走mAlbumView.resume(),从而AlbumSlidingWindow中由县城吃喝提交获取MediaItem的内容才有意义。
5) ReloadTask。
    
     The thread model of ReloadTask
     
     [Reload Task]       [Main Thread]
           |                   |
    getUpdateInfo() -->       |           (synchronous call)
         (wait) <----    getUpdateInfo()
           |                   |
      Load Data               |
           |                   |
    updateContent() -->       |           (synchronous call)
         (wait)          updateContent()
           |                   |
           |                   |
先由mMainHandler发消息MSG_RUN_OBJECT,由主线程处理消息,并调用GetUpdateInfo类的call()。由mSource.getMediaItemCount()查询系统Image.Media.EXTERNAL_CONTENT_URI得到图片数,再创建MediaItem数组,最后发消息给主线程,调用updateContent的call(),逐条更新MediaItem,从LocalAlbum的mItemPath和mProjection可以看出MediaItem即为LocalImage,视频的话是LocalVideo。
6) ThumbnailLoader中submitBitmapTask这里就可以继续分析了。mItem为LocalImage,requestImage创建一个LocalImageRequest实例。由ThreadPool的机制可知,会执行LocalImageRequest的run(), 这里实际由ImageCacheRequest的run()转到LocalImageRequest的onDecodeOriginal,最终得到Bitmap数据。submitBitmapTask执行完通知onFeatureDone,future.get()获得对应的执行结果,即Bitmap。而BitmapLoader会在onFeatureDone结尾调用onLoadComplete把Bitmap传出来,最后由主线程handler发消息刷图。

欢迎转载和技术交流,转载请帮忙注明出处,http://blog.csdn.net/discovery_by_joseph谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值