图片数据加载流程。

Gallery---->GalleryActivity------>AlbumSetPage------->AlbumPage--------->PhotoPage

相册集                        照片集                 某张图片

1,AlbumSetPage.java

private void initializeData(Bundle data) {

String mediaPath = data.getString(AlbumSetPage.KEY_MEDIA_PATH);

mMediaSet = mActivity.getDataManager().getMediaSet(mediaPath);

mSelectionManager.setSourceMediaSet(mMediaSet);

mAlbumSetDataAdapter = new AlbumSetDataLoader(

mActivity, mMediaSet, DATA_CACHE_SIZE);

mAlbumSetDataAdapter.setLoadingListener(new MyLoadingListener());

}

增加回掉函数,当AlbumSetDataLoader.java发生变化时,更新界面

2,AlbumSetDataloader.java

public void resume() {

mSource.addContentListener(mSourceListener);

mReloadTask = new ReloadTask();

mReloadTask.start();

增加回调函数,当数据库发生变化时,加载数据。

 

3,LocalAlbumSet.java (extends MediaSet)

public void addContentListener(ContentListener listener) {

/// M: [BUG.MODIFY] avoid ConcurrentModificationException @{

/*mListeners.put(listener, null);*/

synchronized(WEAK_HASH_MAP_LOCK) {

mListeners.put(listener, null);

}

  增加回调直接和数据库打交道。

4,DataManager.java

public synchronized void initializeSourceMap() {

if (!mSourceMap.isEmpty()) return;

// the order matters, the UriSource must come last

addSource(new LocalSource(mApplication));

新建LocalSource.java

 

5,LocalSource.java(extends MediaSource)

@Override

public MediaObject createMediaObject(Path path) {

GalleryApp app = mApplication;

switch (mMatcher.match(path)) {

case LOCAL_ALL_ALBUMSET:

case LOCAL_IMAGE_ALBUMSET:

case LOCAL_VIDEO_ALBUMSET:

return new LocalAlbumSet(path, mApplication);

新建LocalAlbumSet

 

6,LocalAlbumSet.java (extends MediaSet)

public LocalAlbumSet(Path path, GalleryApp application) {

super(path, nextVersionNumber());

mApplication = application;

mHandler = new Handler(application.getMainLooper());

mType = getTypeFromPath(path);

mNotifier = new ChangeNotifier(this, mWatchUris, application);

mName = application.getResources().getString(

R.string.set_label_local_albums);

}

private static final Uri[] mWatchUris =

{Images.Media.EXTERNAL_CONTENT_URI, Video.Media.EXTERNAL_CONTENT_URI};

将监控要监控的图片和视频url添加到ChangeNotifier中。

 

7,ChangeNotifier.java

public ChangeNotifier(MediaSet set, Uri[] uris, GalleryApp application) {

mMediaSet = set;

for (int i = 0; i < uris.length; i++) {

application.getDataManager().registerChangeNotifier(uris[i], this);

  注册url

 

8,DataManager.java

public void registerChangeNotifier(Uri uri, ChangeNotifier notifier) {

NotifyBroker broker = null;

synchronized (mNotifierMap) {

broker = mNotifierMap.get(uri);

if (broker == null) {

broker = new NotifyBroker(mDefaultMainHandler);

mApplication.getContentResolver()

.registerContentObserver(uri, true, broker);

mNotifierMap.put(uri, broker);

}

}

broker.registerNotifier(notifier);

}

将url和NotifyBroker进行关联,当url发生变化时,就调用回调类broker

9,DataManager.java

private static class NotifyBroker extends ContentObserver {

@Override

public synchronized void onChange(boolean selfChange) {

for(ChangeNotifier notifier : mNotifiers.keySet()) {

notifier.onChange(selfChange);

}

}

当url发生变化时,就调用。notifier.onChange(selfChange)

-----àmMediaSet.notifyContentChanged();(ChangeNotifier.java)

--à listener.onContentDirty();(LocalAlbumSet.java (extends MediaSet))

Android5.1图库Gallery2代码分析数据加载流程的更多相关文章

  1. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  2. Android4.0图库Gallery2代码分析(一) 程序整体结构

    Android4.0图库Gallery2代码分析(一) 程序整体结构 Gallery2的用例图分析:Gallery2主要功能是实现本地存储器.MTP存储器和网络存储器中媒体(图像和视频)的浏览.显示和 ...

  3. Redis深入学习笔记(一)Redis启动数据加载流程

    这两年使用Redis从单节点到主备,从主备到一主多从,再到现在使用集群,碰到很多坑,所以决定深入学习下Redis工作原理并予以记录. 本系列主要记录了Redis工作原理的一些要点,当然配置搭建和使用这 ...

  4. android4.0 的图库Gallery2代码分析(一)

    最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http: ...

  5. android4.0 的图库Gallery2代码分析(四) 之相册的数据处理以及显示

    最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http: ...

  6. android4.0 的图库Gallery2代码分析(三) 之Applition的初始化准备

    Applition的初始化准备 图库的一切动作都明显地起源于Application.这是区别与其他那种感觉不到Application存在,仅仅感觉到Activity存在的简单应用的一个特点. 图库的a ...

  7. android4.0 的图库Gallery2代码分析(二)

    最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http: ...

  8. Android 7.0 Gallery图库源码分析3 - 数据加载及显示流程

    前面分析Gallery启动流程时,说了传给DataManager的data的key是AlbumSetPage.KEY_MEDIA_PATH,value值,是”/combo/{/local/all,/p ...

  9. DICOM:DICOM三大开源库对比分析之“数据加载”

    背景: 上一篇博文DICOM:DICOM万能编辑工具之Sante DICOM Editor介绍了DICOM万能编辑工具,在日常使用过程中发现,“只要Sante DICOM Editor打不开的数据,基 ...

随机推荐

  1. SharePoint 2010 Modal Dialog

    SharePoint 2010 Modal Dialog Tweet   Modal dialog play very important role to improve the user exper ...

  2. python3.5 + django1.9.1+mysql

    python3 对mysql 的驱动不再是mysqldb 具体步骤 : 1 安装依赖 pip install PyMySQL 2 修改配置 __init__.py import pymysql pym ...

  3. 解析:DNS 原理(入门篇)

    DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...

  4. 二维 ST POJ 2019

    题目大意:给你一个n*n的矩阵,每次给你一个点(x,y),以其为左上角,宽度为b的矩阵中最小的数值和最大数值的差是多少?  一共k个询问. 思路:简单的二维st. 定义dp(i,j,k,L)表示以(i ...

  5. UICollectionView之自定义Layout

    #import <UIKit/UIKit.h> @interface WQViewController : UIViewController - (id)initWithFrame:(CG ...

  6. linux sort 用法

    sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式: sort [-bcfMnrtk][源文件][-o 输出文件]补充说明:sort可针对文本文件的内容,以行为单位来排序. 参 数: ...

  7. Template - Strategy

    模板模式是一种基于继承的松耦合模式,其设计思路为,abstract类提供一组接口但不实现,不同concrete类继承同一接口并完成不同功能.如下图所示: 模板模式实现较为简单,TemplateMeth ...

  8. php cookies自动登录

    <?php header('Content-type: text/html; charset=utf-8'); error_reporting(0); //自动登陆 if($_COOKIE[&q ...

  9. CDockablePane 关闭的问题

    显示或者隐藏 当点击CDockablePane上的关闭按钮时,并不能将其关闭,知识将其隐藏了起来,如果需要重新显示或隐藏,则相关命令的响应函数如下: if(m_Panes.GetSafeHwnd()) ...

  10. this的应用

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...