LoaderManager 从getLoaderManager initLoader 0 null this

               

首先一起看一下整个LoaderManager类文件, 尼玛..

源码: 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)

           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值