Android - onLoadFinished没有调用

pet*_*ack 9 android android-loadermanager android-loader

我正面临着Loader的问题.

我有一个Activity,它显示从本地DB检索的记录列表.活动开始时,记录将通过LoaderManager.initLoader()方法自动加载.

还可以通过ActionBarSherlock中的刷新按钮手动刷新列表.但是,在完成另一个向DB添加记录的活动之后,不会调用onLoadFinished.

我正在使用SimpleCursorLoader,这里是活动的代码片段:

@Override
public void onStart() {
   ...
   getSupportLoaderManager().initLoader(0, null, this);
}

@Override
public void onPause() {
   ...
   getSupportLoaderManager().destroyLoader(0);
}

public void refreshRecords() {
   getSupportLoaderManager().restartLoader(0, null, this);
}

@Override
public Loader<Cursor> onCreateLoader(int id, final Bundle args) {
Loader<Cursor> l = new SimpleCursorLoader(this) {
    @Override
    public Cursor loadInBackground() {
        return recordDAO.getCursor();
    }
};
l.forceLoad();
return l;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
   // updateUI
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
Run Code Online (Sandbox Code Playgroud)

问题是,在完成其他活动之后,会onLoaderCreate被调用,但onLoaderFinished不会被调用.

经过一些调试,我发现它SimpleCursorAdapter.deliverResults()也被称为,芽结束了.. if (isReset()) { ..

我错过了什么吗?如何强制重新加载数据?

先感谢您

RaB*_*RaB 16

由于讨论,我终于找到了解决这个问题的方法

https://groups.google.com/forum/#!topic/android-developers/DbKL6PVyhLI

public static <T> void initLoader(final int loaderId, final Bundle args, final LoaderCallbacks<T> callbacks,
        final LoaderManager loaderManager) {
    final Loader<T> loader = loaderManager.getLoader(loaderId);
    if (loader != null && loader.isReset()) {
        loaderManager.restartLoader(loaderId, args, callbacks);
    } else {
        loaderManager.initLoader(loaderId, args, callbacks);
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,从支持库28开始,请确保不要从内部调用initLoader Fragment.onCreate().正如更新的文档所述

您通常在活动的onCreate()方法中或在片段的onActivityCreated()方法中初始化Loader .

请参阅https://developer.android.com/guide/components/loaders

  • 几乎正确的解决方案:如https://groups.google.com/forum/#!topic/android-developers/DbKL6PVyhLI(并且我对其进行了实验)所述,重置条件为!loader.isReset(),即'如果没有重置加载器,你应该只重启加载器.(由Etienne撰写).请更新你的答案. (4认同)