您的位置:首页 > 其它

重写CursorLoader导致的问题

2016-05-03 14:14 260 查看
在重写CursorLoader的时候,我执行了对Uri的监听,但是发现当其改变时候并没有执行onloadfininshed的方法,经查阅源码得知

loadinbackground方法里面数据改变却没有新的的对象产生的时候不会触发callOnLoadFinished,从而不会触发onLoadFinished!

源码如下LoaderManager.java

  public void onLoadComplete(Loader<Object> loader, Object data) {

            if (DEBUG) Log.v(TAG, "onLoadComplete: " + this);

            

            if (mDestroyed) {

                if (DEBUG) Log.v(TAG, "  Ignoring load complete -- destroyed");

                return;

            }

            if (mLoaders.get(mId) != this) {

                // This data is not coming from the current active loader.

                // We don't care about it.

                if (DEBUG) Log.v(TAG, "  Ignoring load complete -- not active");

                return;

            }

            

            LoaderInfo pending = mPendingLoader;

            if (pending != null) {

                // There is a new request pending and we were just

                // waiting for the old one to complete before starting

           
4000
    // it.  So now it is time, switch over to the new loader.

                if (DEBUG) Log.v(TAG, "  Switching to pending loader: " + pending);

                mPendingLoader = null;

                mLoaders.put(mId, null);

                destroy();

                installLoader(pending);

                return;

            }

            

            // Notify of the new data so the app can switch out the old data before

            // we try to destroy it.

            if (mData != data || !mHaveData) {

                mData = data;

                mHaveData = true;

                if (mStarted) {

                    callOnLoadFinished(loader, data);

                }

            }

            //if (DEBUG) Log.v(TAG, "  onLoadFinished returned: " + this);

            // We have now given the application the new loader with its

            // loaded data, so it should have stopped using the previous

            // loader.  If there is a previous loader on the inactive list,

            // clean it up.

            LoaderInfo info = mInactiveLoaders.get(mId);

            if (info != null && info != this) {

                info.mDeliveredData = false;

                info.destroy();

                mInactiveLoaders.remove(mId);

            }

            if (mActivity != null && !hasRunningLoaders()) {

                mActivity.mFragments.startPendingDeferredFragments();

            }

        }

        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;

            }

        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: