图片数据加载流程。

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. android网络开发之测试机连接到服务器上面

    1:本人使用Tomcat作为服务器软件,首先打开Tomcat.(可以在浏览器中输入http://www.127.0.0.1:8080/查看) 2:服务器后台使用Servelt开发,这里不再讲解. 3: ...

  2. MySQL 的实时性能监控利器【转】

    操作系统及MySQL数据库的实时性能状态数据尤为重要,特别是在有性能抖动的时候,这些实时的性能数据可以快速帮助你定位系统或MySQL数据库的性能瓶颈,就像你在Linux系统上使用「top,sar,io ...

  3. mysql 中tinytext、text、mediumtext和longtext详解

    一.数字类型 类型 范围 说明   Char(N) [ binary] N=1~255 个字元binary :分辨大小写 固定长度 std_name cahr(32) not null VarChar ...

  4. Js根据class名替换html标签内容 ,在某标签前后添加内容

    function getClass(obj, attr) { var aArray = [];//定义一个新的空数组 var i = 0; var aAll = document.getElement ...

  5. dos cmd重启2003命令shutdown -r -t 0

    用cmd命令来关闭或重启电脑. at 2:00 /every:Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday shutdown /r ...

  6. PHP开发之路之一--WAMP的安装和配置

    来到新公司,领导说后面一个web系统不用ASP.NET做了,用国外的一个Drupal进行二次开发.这个Drupal是基于PHP的一款开源CMS系统,那就必须要自学PHP咯~ 接下来说说正题吧: 一.安 ...

  7. regress

    #! /bin/ksh ############### ###   UAT   ### ############### export ENVS=/test/change/env/env_test.sq ...

  8. mysql char varchar 区别

    数据库建表  字符串字段类型的选择 char与varchar的区别: char      长度固定,char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空 ...

  9. ReactiveCocoa 用法实例

      我个人非常推崇ReactiveCocoa,它就像中国的太极,太极生两仪,两仪生四象,四象生八卦,八卦生万物.ReactiveCocoa是一个高度抽象的编程框架,它真的很抽象,初看你不知道它是要干嘛 ...

  10. maven认识

    在这里普及一下知识: ┣ maven与ant是同类,构建工具 ┣ svn与cvs,css是同类,版本控制工具 1.为什么要用Maven? 在进行软件开发的过程中,无论什么项目,采用何种技术,使用何种编 ...