Android5.1图库Gallery2代码分析数据加载流程
图片数据加载流程。
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代码分析数据加载流程的更多相关文章
- Android4.0图库Gallery2代码分析(二) 数据管理和数据加载
Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...
- Android4.0图库Gallery2代码分析(一) 程序整体结构
Android4.0图库Gallery2代码分析(一) 程序整体结构 Gallery2的用例图分析:Gallery2主要功能是实现本地存储器.MTP存储器和网络存储器中媒体(图像和视频)的浏览.显示和 ...
- Redis深入学习笔记(一)Redis启动数据加载流程
这两年使用Redis从单节点到主备,从主备到一主多从,再到现在使用集群,碰到很多坑,所以决定深入学习下Redis工作原理并予以记录. 本系列主要记录了Redis工作原理的一些要点,当然配置搭建和使用这 ...
- android4.0 的图库Gallery2代码分析(一)
最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http: ...
- android4.0 的图库Gallery2代码分析(四) 之相册的数据处理以及显示
最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http: ...
- android4.0 的图库Gallery2代码分析(三) 之Applition的初始化准备
Applition的初始化准备 图库的一切动作都明显地起源于Application.这是区别与其他那种感觉不到Application存在,仅仅感觉到Activity存在的简单应用的一个特点. 图库的a ...
- android4.0 的图库Gallery2代码分析(二)
最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http: ...
- Android 7.0 Gallery图库源码分析3 - 数据加载及显示流程
前面分析Gallery启动流程时,说了传给DataManager的data的key是AlbumSetPage.KEY_MEDIA_PATH,value值,是”/combo/{/local/all,/p ...
- DICOM:DICOM三大开源库对比分析之“数据加载”
背景: 上一篇博文DICOM:DICOM万能编辑工具之Sante DICOM Editor介绍了DICOM万能编辑工具,在日常使用过程中发现,“只要Sante DICOM Editor打不开的数据,基 ...
随机推荐
- 7.在第4题中Hello.class所在路径下, 输入命令:java Hello.class,会出现什么结果,为什么?
java Hello已经是加载类了
- Mac下截图快捷键
Cmd+Shift+3:全屏截图:截取整个屏幕,保存截图至桌面文件夹.Cmd+Shift+4:区域截图:鼠标光标变成带坐标的小十字,通过拖拽截取特定区域,保存截图至桌面文件夹.Cmd+Shift+4 ...
- AIR使用文件对象操作文件和目录
文件对象是啥?文件对象(File对象)是在文件系统中指向文件或目录的指针.由于安全原因,只在AIR中可用. 文件对象能做啥? 获取特定目录,包括用户目录.用户文档目录.该应用程序启动的目录和程序目录 ...
- 把aspx页面输出成xml的方法注意事项
先贴代码 Response.Charset = "gb2312"; Response.ContentType = "text/xml"; Response.Co ...
- VMware设置NAT网络
很多初学者迷茫与如何实现虚拟机VMware与主机互联,这里小编介绍下简单实用的NAT网络. 工具/原料 VMware 方法/步骤 打开VMware,选择 编辑, 虚拟网络编辑器 默认情况下, ...
- HTML+CSS Day06 超链接的样式与搭配
1.格式 a:link {} 普通的.未被访问的链接 a:visited {} 用户已访问的链接 a:hover {} 鼠标指针位于链接的上方 a:active{} 链接被点击的时刻 2.常 ...
- Linux 安全模块
LSM是Linux Secrity Module的简称,即linux安全模块.其是一种轻量级通用访问控制框架,适合于多种访问控制模型在它上面以内核可加载模块的形实现.用户可以根据自己的需求选择合适的安 ...
- JUST SORT
We define B is a Divisor of one number A if A is divisible by B. So, the divisors of 12 are 1, 2, 3, ...
- java 数据结构 队列的实现
java 数据结构队列的代码实现,可以简单的进行入队列和出队列的操作 /** * java数据结构之队列的实现 * 2016/4/27 **/ package cn.Link; import java ...
- 多校 Robot Motion
题目链接:http://acm.hust.edu.cn/vjudge/contest/124435#problem/J 密码:acm Sample Input NEESWE WWWESS SNWWWW ...