【问题标题】:Difference between restartLoader and onContentChangedrestartLoader 和 onContentChanged 的​​区别
【发布时间】:2013-05-24 05:32:20
【问题描述】:

目前,我有一个加载器

@Override
public Loader<List<HomeMenuRowInfo>> onCreateLoader(int arg0, Bundle bundle) {
    return new HomeMenuRowInfosLoader(this.getSherlockActivity());
}

有时,由于内容更改,我需要让加载程序再次重新加载。我会这样做的。

this.getLoaderManager().getLoader(0).onContentChanged();

但是,我想在内容更改时将一些额外的捆绑信息传递给onCreateLoader 回调。我意识到通过使用onContentChanged,没有办法这样做。

我能想到的唯一方法是

this.getLoaderManager().restartLoader(0, bundle, this);

我想知道,Loader 的行为与使用 restartLoader 而不是 onContentChanged 的行为是否有任何重大差异,除了传递捆绑的能力吗?

【问题讨论】:

    标签: android android-loadermanager android-loader


    【解决方案1】:

    我认为,主要区别在于 restartLoader 方法会破坏具有相同 ID 的旧加载器并启动一个新加载器,而 onContentChanged 方法要么强制加载器加载 (forceLoad),要么只是设置指示在加载程序停止时内容已更改的标志。在第二种情况下,加载程序的“所有者”在内容更改后仍对其(重新)加载负责。我假设这是由 loaderManager 自动完成的,就像在 restartLoader 案例中一样。

    如果您决定使用restartLoader 方法,您应该记住旧加载程序的破坏以及对您的应用程序可能产生的影响,例如缓慢的重新初始化等等。

    您可以查看方法文档以获取更多信息 - restartLoaderonContentChanged

    还要注意旧的加载器会被销毁新的加载器完成它的工作

    【讨论】:

      【解决方案2】:

      状态图应该有助于理解如何使用 API。第一次我也花了很多时间让图片清晰。使用我的工作!

      文章:https://plus.google.com/117981280628062796190/posts/8b9RmQvxudb

      【讨论】:

        【解决方案3】:

        每当您想要新数据或想要更改光标的参数时,请致电 restartLoader

        如果你使用initLoader来加载数据

        lm = fragment.getLoaderManager();
        lm.initLoader(LOADER_ID_LIST, null, this);
        

        每次调用initLoader 都会将相同的光标返回到onLoadFinishedonCreateLoader 方法只会在第一次调用 initLoader 时被调用。因此,您无法更改查询。 onLoadFinished 方法得到相同的游标相同的数据。

        @Override
        public void onLoadFinished(
                android.support.v4.content.Loader<Cursor> loader, Cursor cursor) {
            switch (loader.getId()) {
            case LOADER_ID_LIST:
                // The asynchronous load is complete and the data
                // load a list of
                populateFromCursor(cursor);
                break;
            case LOADER_ID_ENTRY:
                populateFromCursor(cursor);
                break;
            }
            // The listview now displays the queried data.
        }
        

        所以要将新的游标数据发送到onLoadFinished,请使用restartLoader,如果需要,您可以传入捆绑信息。下面我传递 null 因为有一个全局变量可用。

        lm = fragment.getLoaderManager();
        lm.restartLoader(LOADER_ID_LIST, null, this);
        

        loaderManager 然后会调用onCreateLoaderMethod

        @Override
        public android.support.v4.content.Loader<Cursor> onCreateLoader(int id,
                Bundle args) {
        
            android.support.v4.content.Loader<Cursor> ret = null;
        
            // Create a new CursorLoader with the following query parameters.
            switch (id) {
        
            // load the entire list
            case LOADER_ID_LIST:
                String sortOrder = null;
                switch (mSortOrder) {
                case 0:
                    sortOrder = RidesDatabaseHandler.KEY_DATE_UPDATE + " desc";
                    break;
                case 1:
                    sortOrder = RidesDatabaseHandler.KEY_ID + " desc";
                    break;
                case 2:
                    sortOrder = RidesDatabaseHandler.KEY_NAME;
                }
                return new CursorLoader(context, RidesDatabaseProvider.CONTENT_URI,
                        PROJECTION, null, null, sortOrder);
        
                // load a single item
            case LOADER_ID_ENTRY:
                sortOrder = null;
                String where = RidesDatabaseHandler.KEY_ID + "=?";
        
                String[] whereArgs = new String[] { Integer.toString(lastshownitem) };
        
                return new CursorLoader(context, RidesDatabaseProvider.CONTENT_URI,
                        PROJECTION, where, whereArgs, null);
            }
            return ret;
        }
        

        注意:您不必每次都调用initLoader,除非您真的想要从先前查询返回的相同数据,否则每次都可以调用restartLoader。您不必致电onContentChanged() 并且在docs 中它说Loader.ForceLoadContentObserver 已为您完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-07
          • 2011-10-20
          • 2020-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多