zoukankan      html  css  js  c++  java
  • 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))

  • 相关阅读:
    [轉]Flex实现代码分离mxml/as
    [轉]PHP执行MYSQL存储过程报错:Commands out of sync; you can't run this command now 问题的解决
    [轉]mysqli & pdo使用实例和详解
    JSON格式驗證以及格式說明
    [轉]can't return a result set in the given context及参数解释
    PHP ADODB資源
    [轉]Virtual PC 网络设置(Networking)
    [轉]20个非常有用的PHP类库
    [轉]MySQL存储过程 ERROR Handler 异常处理
    [轉]如何通过Jquery获取radio的值
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/4865366.html
Copyright © 2011-2022 走看看