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.pswp.cn/news/396748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396748.shtml
英文地址,請注明出處:http://en.pswp.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;使用戶可以輕松快捷的完成查找、刪除、替換…