6

目前,我有一个装载机

@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

4

3 回答 3

4

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

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

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

另请注意,旧加载器在新加载器完成工作时被销毁

于 2014-03-10T11:53:45.873 回答
1

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

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

装载机状态图

于 2015-02-13T12:16:14.273 回答
0

restartLoader每次您想要新数据或想要更改光标的参数时调用。

如果您使用initLoader加载数据

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

每次调用都initLoader将返回相同的光标到onLoadFinished. 该onCreateLoader方法只会在第一次调用 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(),并且在文档中说这Loader.ForceLoadContentObserver是为您完成的。

于 2014-03-13T14:52:52.260 回答