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打不开的数据,基 ...
随机推荐
- CentOS ulimit
Linux 文件系统设置 文件句柄数 ulimit -n 查看 echo "* - nofile 65536" >> /etc/security/limits.conf ...
- Centos下 Nginx安装与配置
网上找了好多资料.都很难找全,这里以这个目录为主,进行备注. Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.它最常的用途是提供 ...
- 阿里云Linux挂载数据盘
Linux 系统挂载数据盘 适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) * Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化 ...
- 多个dropdownlist只有第一个能选中,其他选不中之我见
前段时间遇到这个问题,发现在页面中的源代码已经显示selected=“selected" 可是还是选中的第一项,试过很多办法,都不行,最后只好靠js来解决了,获取所有的dropdownlis ...
- TextUtils
/** * 计算关键字在文本中出现的次数 * @param text * @param key * @return */ public static int count(String text, St ...
- zTree异步加载并初始化树时全部展开(贴主要代码)
<%@page pageEncoding="UTF-8"%> <%@include file="/commons/include/html_doctyp ...
- CodeForces 429B Working out 动态规划
Description Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to loo ...
- Swift 使用Extension 场景 浅析
别人一看到我的 Swift 代码,立刻就会问我为什么如此频繁的使用 extension.这是前几天在我写的另一篇文章中收到的评论: 我大量使用 extension 的主要目的是为了提高代码可读性.以下 ...
- CDockablePane 记忆界面布局的问题
CWinAppEx类的LoadCustomState()和SaveCustomState()用于向注册表读取和保存应用程序的界面信息,重载该方法可以取消自动记忆界面布局. void CxxxApp:: ...
- windows下python+Django+eclipse开发环境的配置
1.JDK环境的安装 在http://www.java.com/zh_CN/download/faq/develop.xml 页面下,点击JDK下载,下载所需的jdk版本.直接点击安装即可. 2.py ...