亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

[LoaderManager]從getLoaderManager().initLoad

系統 2127 0

首先一起看一下整個LoaderManager類文件, 尼瑪..

[LoaderManager]從getLoaderManager().initLoader(0, null, this);說開去

源碼:http://www.oschina.net/code/explore/android-4.0.1/core/java/android/app/LoaderManager.java


先來看下getLoaderManager方法:

        public LoaderManager getLoaderManager() {

        if (mLoaderManager != null) {
            return mLoaderManager;
        }
        mCheckedForLoaderManager = true;
        mLoaderManager = getLoaderManager(-1, mLoadersStarted, true);
        return mLoaderManager;
    }

    LoaderManagerImpl getLoaderManager(int index, boolean started, boolean create) {
        if (mAllLoaderManagers == null) {
            mAllLoaderManagers = new SparseArray<LoaderManagerImpl>();
        }
        LoaderManagerImpl lm = mAllLoaderManagers.get(index);
        if (lm == null) {
            if (create) {
                lm = new LoaderManagerImpl(this, started);
                mAllLoaderManagers.put(index, lm);
            }
        } else {
            lm.updateActivity(this);
        }
        return lm;
    }

  

可以很清晰的看到,實際上是獲取了一個 LoaderManagerImpl實例。很自然,接下來應該看下initLoader()方法了

    final SparseArray<LoaderInfo> mLoaders = new SparseArray<LoaderInfo>();
  

        @SuppressWarnings("unchecked")
    public <D> Loader<D> initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> callback) {
        if (mCreatingLoader) {
            throw new IllegalStateException("Called while creating a loader");
        }
         
        LoaderInfo info = mLoaders.get(id);
         
        if (DEBUG) Log.v(TAG, "initLoader in " + this + ": args=" + args);
 
        if (info == null) {
            // Loader doesn't already exist; create.
            info = createAndInstallLoader(id, args,  (LoaderManager.LoaderCallbacks<Object>)callback);
            if (DEBUG) Log.v(TAG, "  Created new loader " + info);
        } else {
            if (DEBUG) Log.v(TAG, "  Re-using existing loader " + info);
            info.mCallbacks = (LoaderManager.LoaderCallbacks<Object>)callback;
        }
         
        if (info.mHaveData && mStarted) {
            // If the loader has already generated its data, report it now.
            info.callOnLoadFinished(info.mLoader, info.mData);
        }
         
        return (Loader<D>)info.mLoader;
    }

  

一切的一起從這個方法開始了。

從代碼中可以看到,它會先到 mLoaders中查找這個Loader, 如果該id的Loader還不存在,那就執行 createAndInstallLoader方法 創建;

        private LoaderInfo createLoader(int id, Bundle args,
            LoaderManager.LoaderCallbacks<Object> callback) {
        LoaderInfo info = new LoaderInfo(id, args,  (LoaderManager.LoaderCallbacks<Object>)callback);
        Loader<Object> loader = callback.onCreateLoader(id, args);
        info.mLoader = (Loader<Object>)loader;
        return info;
    }
    
    private LoaderInfo createAndInstallLoader(int id, Bundle args,
            LoaderManager.LoaderCallbacks<Object> callback) {
        try {
            mCreatingLoader = true;
            LoaderInfo info = createLoader(id, args, callback);
            installLoader(info);
            return info;
        } finally {
            mCreatingLoader = false;
        }
    }
    
    void installLoader(LoaderInfo info) {
        mLoaders.put(info.mId, info);
        if (mStarted) {
            // The activity will start all existing loaders in it's onStart(),
            // so only start them here if we're past that point of the activitiy's
            // life cycle
            info.start();
        }
    }
  

可以看到,createAndInstallLoader方法又去調用了createLoader 和installLoader方法。createLoader 執行回調onCreateLoader以獲取你的Loader實例,而installLoader會執行startLoading方法,以啟動你的Loader。


注意,此處回調了LoaderCallBack的 onCreateLoader方法!!


如果已經存在,就把callback參數傳給LoaderInfo對象;

接下來調用LoaderInfo的 callOnLoadFinished方法!

            void callOnLoadFinished(Loader<Object> loader, Object data) {
            if (mCallbacks != null) {
                String lastBecause = null;
                if (mActivity != null) {
                    lastBecause = mActivity.mFragments.mNoTransactionsBecause;
                    mActivity.mFragments.mNoTransactionsBecause = "onLoadFinished";
                }
                try {
                    if (DEBUG) Log.v(TAG, "  onLoadFinished in " + loader + ": "
                            + loader.dataToString(data));
                    mCallbacks.onLoadFinished(loader, data);
                } finally {
                    if (mActivity != null) {
                        mActivity.mFragments.mNoTransactionsBecause = lastBecause;
                    }
                }
                mDeliveredData = true;
            }
        }

  

注意,此處回調了LoaderCallBack的 onLoadFinished 方法!!


那還有個 onLoaderReset 方法, 什么時候調用呢? 可以明確的告訴你,這個方法只有在Loader被銷毀的時候才會調用。

    		getLoaderManager().destroyLoader(int)
		getLoaderManager().restartLoader(int arg0, Bundle arg1, LoaderCallbacks<D> arg2)
  

[LoaderManager]從getLoaderManager().initLoader(0, null, this);說開去


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美hdvideosex4k | 亚洲a视频在线 | 久久图库99图库 | 黄视频网站观看 | 国产成人精品天堂 | 欧美国产日韩精品 | 天天射综合 | 99热成人精品国产免男男 | 亚洲国产成人久久精品影视 | 国产精品久久成人影院 | 国产成人夜间影院在线观看 | 五月婷婷伊人 | 亚洲视频国产 | 天天干 夜夜操 | 久久五月婷| 亚洲精品国产v片在线观看 亚洲精品国产啊女成拍色拍 | 在线播放日韩 | 最近中文字幕无免费视频 | 久久天天躁狠狠躁夜夜爽蜜月 | 亚洲精品6久久久久中文字幕 | 国产色综合久久无码有码 | 亚洲一区二区三区福利在线 | 在线久 | 亚洲欧美日韩国产vr在线观 | 日本久久久久中文字幕 | 九九热在线免费视频 | 成人小视频在线播放 | 国产精品视频久久久 | 毛片在线播放a | 一级a爱片久久毛片 | 狠狠澡夜夜澡人人爽 | 亚欧精品一区二区三区四区 | 日韩一级片 | 日本一级毛片不卡免费 | 欧美aⅴ | 看真人视频一级毛片 | 在线视频 国产交换 | 欧美高清一区二区 | 伊人精品国产 | 被狠狠操 | 四虎最新永久在线精品免费 |