Android平台Gallery2应用分析(六)---PhotoPage和PhotoView

PhotoPage
PhotoPage的几个重要成员:

onCreate中创建PhotoView,从传入的mSetPathString区分创建PhotoDataAdapter还是SinglePhotoDataAdapter。如果从相册一级级进入,则创建PhotoDataAdapter,如果从文件管理器进入,则创建SinglePhotoDataAdapter。以从相册进入为例:
1) 创建PhotoDataAdapter,mPhotoView.setModel(mModel),在PhotoView中setModel除给本身的mModel赋值外,还给mTileView的mModel赋值(mTileView是TileImageView类型)。
2) onResume中,mModel.resume(), mPhotoView.resume(),其中由第一条知道mModel是PhotoDataAdapter类型,转到PhotoDataAdapter看看做了什么?
3) PhotoDataAdapter.resume。先执行updateImageCache(),再执行updateImageRequests,最后创建一个ReloadTask并启动线程。
        3.1) updateImageCache()。取出mImageCache中有解码任务的Item,释放内存,如该Item之前并无task,则放入mImageCache中。
        3.2) updateImageRequests()。取出当前的item,sImageFetchSeq是各种解码方式的静态数组,在这里会依次遍历一遍,执行startTaskIfNeeded(),执行完后,再将task取消释放内存。
4) startTaskIfNeeded()。因ImageEntry的requestScreenNail和requestedFullImage都是INVALID_DATA_VERSION。所以,都会执行screenNailTask和fullImageTask。
        4.1) entry.screenNailTask = mThreadPool.submit(new ScreenNailJob(item),
                                                    new ScreenNailListener(item));
由ThreadPool的机制可知,会在创建完screenNailJob(item)后,调用run()。在run()中,得到Bitmap bitmap = mItem.requestImage(…).run(jc)。其中,mItem为LocalImage,调用LocalImage的requestImage后得到解码后的Bitmap。然后,ThreadPool会调用Listener即screenNailListener的onFeatureDone来通知解码完成。onFeatureDone发消息给MainThread刷新并调用Listener中的run()函数,执行updateScreenNail。其中有个for循环,依次对图片做刷新,mPhotoView.notifyImageChange(i)会从mPictures中得到图片并reload(),这里对应screenNailPicture,而在reload中会调用setScreenNail(mModel.getScreenNial(mIndex)),mModel从第一条已知是PhotoDataAdapter类型,在getScreenNail中取得缓存的ImageEntry中的图片解码数据screenNail。
        4.2) entry.fullImageTask = mThreadPool.submit(new FullImageJob(item),
                                              new FullImageListener(item));
流程和ScreenNailJob、ScreenNailListener类似,差别在于ScreenNail是当前未显示的图片,而FullImage是当前显示的图片,由mPhotoView.notifyimageChange(0)可以看出。
PhotoView的触屏代码流程

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

你可能感兴趣的:(android,应用,相册,多媒体应用,Gallery2)