图片数据加载流程。

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. shell编程之服务脚本编写,文件锁以及信号捕获

    shell脚本编程是linux运维工程师必备的技能,也是非常重要的一个技能,所以把shell编程学好,只有好处.基础语法我也就不讲了,学过C语言这些语言的,稍微看一下就能明白shell编程的基础,所以 ...

  2. 给EditText设置边框

    布局文件中加入background属性: <EditText android:layout_width="200dp" android:layout_height=" ...

  3. perl的Getopt::Long和pod::usage ?

    来源: http://www.cnblogs.com/itech/archive/2012/08/07/2627267.html 代码: 需要显式地定义变量且初始化.例如optionX. 如果没有定义 ...

  4. mxml日期显示使用

    mxml代码: <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx= ...

  5. avd

    http://stackoverflow.com/questions/2662650/making-the-android-emulator-run-faster http://www.cnblogs ...

  6. 上海赛趣-top.mainFrame.tabAddHandler方法详解

    top.mainFrame.tabAddHandler("item"+Id,'项目:'+itemname,'<%=basePath%>bizitem/goEditIte ...

  7. 【素数】 poj 2739 一个数能有多少种连续素数相加方案

    简单题 素数打表   根据数据量  用n2算法遍历  开一个save[k]素数存前k个素数和即可. #include <iostream> #include <cstdio> ...

  8. swool安装

    swoole安装 安装完PHP后,即可安装swoole扩展. swoole扩展下载地址:https://github.com/swoole/swoole-src/releases 尽量选择stable ...

  9. opencv----人脸美白算法,祛斑,祛痘,磨皮等

    现在各种手机camera软件都自带图像美颜处理,但是成熟的算法在网上很难搜到,博主也是自己摸索了自己做出来了,跟美图秀秀的处理效果相比,还不错,感觉很好,所以PO上来,与各位博友分享之. 首先是根据网 ...

  10. Local declaration of 'XXX' hides instance variable

    今天调试程序遇到这么一个警告! Local declaration of 'XXX' hides instance variable 遇到这种原因,是因为本地变量跟函数参数变量同名.改变其一即可.