android平台gallery2应用分析,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))

原文:http://www.cnblogs.com/senior-engineer/p/4865366.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python开课吧1980课程_开课吧的课程怎么样?

就那那些编程开发课来说。现在网络上充斥着大量的编程开发课程&#xff0c;什么python的&#xff0c;java的&#xff0c;c的&#xff0c;而且名字一个比一个夸张&#xff0c;21天精通c&#xff0c;7天熟练运用java&#xff0c;3天掌握python核心代码&#xff0c;这些课程标题简…

专业概念

1.JDBC: java数据库连接&#xff08;JDBC&#xff09;用于在java程序中实现数据库的操作功能&#xff0c;它提供了执行sql语句&#xff0c;访问各种数据库的方法&#xff0c;并为各种不同的数据库提供统一的操作接口&#xff0c;java.sql包中 包含了jdbc操作数据库的所有类 2.…

前端解决跨域问题的8种方案

2019独角兽企业重金招聘Python工程师标准>>> 1.同源策略如下&#xff1a; URL说明是否允许通信http://www.a.com/a.js http://www.a.com/b.js同一域名下允许http://www.a.com/lab/a.js http://www.a.com/script/b.js同一域名下不同文件夹允许http://www.a.com:8000/…

k歌的录音伴奏合成技术如何实现_K歌神器,用唱吧麦克风攀登天籁高峰

自从喜欢上了手机K歌&#xff0c;经常会上传一些自己的作品&#xff0c;起初无论音质如何都是乐在其中&#xff0c;可时间久了发现回放效果确实不如那榜单上的高手&#xff0c;究其原因想到了麦克风&#xff0c;网上一搜果然有各种K歌辅助工具&#xff0c;多番对比之下&#xf…

浅谈内存开辟问题和Block内存问题

我们知道&#xff0c;内存分为栈&#xff0c;堆&#xff0c;块。 栈中的内存由系统自己释放&#xff0c;堆是存对象初始化的地方&#xff0c;块是CPU与内存连接的缓冲器&#xff0c;运行速度比内存快&#xff0c;比CPU慢。 例如&#xff0c;我们NSMutableArray *array [NSMuta…

vue render函数_Vue原理解析(一):Vue到底是什么?

Vue&#xff0c;现在前端的当红炸子鸡&#xff0c;随着热度指数上升&#xff0c;实在是有必要从源码的角度&#xff0c;对它功能的实现原理一窥究竟。个人觉得看源码主要是看两样东西&#xff0c;从宏观上来说是它的设计思想和实现原理&#xff1b;微观上来说就是编程技巧&…

scrapy爬虫-setting.py

# Obey robots.txt rulesROBOTSTXT_OBEY False  不遵从网站的robots.txt法则 # See also autothrottle settings and docsDOWNLOAD_DELAY 3  每次下载延迟3秒&#xff0c;防止造成网站攻击 # Override the default request headers:DEFAULT_REQUEST_HEADERS { Accept:…

android点击左上角划出,使用Android中的Path和RectF在左上角右上角左下角绘制圆角...

有一个Path#addRoundRect()重载,它接受一个包含八个值的float数组,其中我们可以为四个角中的每一个指定x和y半径.这些值为[x,y]对,从左上角开始,顺时针绕其余部分.对于我们想要舍入的那些角,我们将该对的两个值都设置为半径值,并将它们保留为零,而不是那些.作为一个说明性示例,…

Nodejs微信开发

因为使用了Bot Framework开发了一个小功能&#xff0c;它目前支持了Skype\Teams\Slack等&#xff0c;但在国内来讲&#xff0c;微信还是一个比较流行的软件&#xff0c;所以需要接上微信 原来开发Bot的时候使用的是.Net开发的&#xff0c;这次我决定使用Nodejs开发一个简单的后…

性别有什么用_为啥不让男孩玩布娃娃?别让你的“性别偏见”,给孩子的人生设限...

在养育孩子的过程中&#xff0c;父母总是会犯许多错误&#xff0c;更是有一些错误会直接使孩子毁掉一生&#xff0c;而性别偏见正是很多家长都会去犯的错误&#xff0c;对男孩和女孩有着刻板印象&#xff0c;也正是因为这一点使孩子的潜力和天赋被压制。前几天我带着孩子去逛商…

android的时间代码怎么写,Android 日期和时间的使用实例详解

Android 日期和时间的使用日期和时间的使用&#xff1b;1&#xff1a;弹出框TimePickerDialog,DatePickerDialog2&#xff1a;组件TimePicker,DatePickerTimePickerDialog的使用&#xff1a;通过点击button显示图一&#xff0c;然后用户可以设置时间DatePickerDialog的使用只需…

andriod studio 查看项目依赖_Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图...

Maven 组件界面介绍如上图标注 1 所示&#xff0c;为常用的 Maven 工具栏&#xff0c;其中最常用的有&#xff1a;第一个按钮&#xff1a;Reimport All Maven Projects 表示根据 pom.xml 重新载入项目。一般单我们在 pom.xml 添加了依赖包或是插件的时候&#xff0c;发现标注 4…

Springboot 2.0.0单元测试

1. 引入spring-boot-starter-test包 1 <?xml version"1.0" encoding"UTF-8"?>2 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"3 xsi:schemaLocation"…

SPRING IN ACTION 第4版笔记-第二章-002-@ComponentScan、@Autowired的用法

一、ComponentScan 1. Configuration //说明此类是配置文件 ComponentScan //开启扫描&#xff0c;会扫描当前类的包及其子包 public class CDPlayerConfig { } 2. ComponentScan(basePackages{"soundsystem", "video"})//扫描多个包 public class CDP…

Kurento协议

2019独角兽企业重金招聘Python工程师标准>>> Kurento媒体服务器可以被两种外部Kurento客户端控制&#xff0c;如Java或JavaScript。这些客户端使用Kuernto协议来和KMS通信。Kurento 协议是基于WebSocket协议&#xff0c;并使用了JSON-RPC V2.0 消息来提交请求和发送…

升级php7_PhpStorm 2019.3 发布,全面支持 PHP 7.4

PhpStorm 2019.3 发布了&#xff0c;这个版本主要集中在性能和质量上&#xff0c;旨在提供一个更稳定、更快的 IDE。PhpStorm 2019.3 全面支持 PHP 7.4&#xff0c;还带来 PSR-12 代码样式&#xff0c;用于远程解释器的 WSL&#xff0c;MongoDB 支持&#xff0c;HTTP 客户端更新…

ftp 客户端 使用http代理 源码_代理服务器连接HTTPS过程

说到HTTPS代理很多人瞬间就会联想到HTTPS的各种证书和各种加密&#xff0c;觉得很高端很复杂的样子。其实不然&#xff0c;代理服务器不需要配置证书、也不需要处理任何加密。因为HTTPS代理是通过Web隧道(Web tunnel)工作的。Web隧道允许用户通过HTTP连接发送非HTTP流量(例如FT…

python解zuobiaoxi方程_Python还能解决数学相关问题?大学生:以后就靠他了,事半功倍...

问题背景高等数学应用非常广&#xff0c;基本上涉及到函数的地方都要用到微积分&#xff0c;还有在几何方面也是如此&#xff0c;计算机的应用让我们能简单快速处理各种高等数学中的计算&#xff0c;比如极限、导数、积分、微分方程等的计算。实验目的使用 Python 通过计算与作…

Android版:验证手机号码的正则表达式 (转)

/** * 验证手机格式 */ public static boolean isMobileNO(String mobiles) { /* 移动&#xff1a;134、135、136、137、138、139、150、151、157(TD)、158、159、187、188 联通&#xff1a;130、131、132、152、155、156、185、186 电信&#xff1a;133、…

基础正则表达式介绍与练习

基础正则表达式介绍与练习 一、什么是正则表达式 在做文字处理或编写程序时&#xff0c;用到查找、替换等功能&#xff0c;使用正则表达式能够简单快捷的完成目标。简单而言&#xff0c;正则表达式通过一些特殊符号的帮助&#xff0c;使用户可以轻松快捷的完成查找、删除、替换…