Android的 - onLoadFinished不叫(Android - onLoadFinis

2019-08-31 06:27发布

我面临着装载机的问题。

有我的活动,其中显示从本地数据库检索的记录列表。 当活动开始时,记录被自动经由LoaderManager.initLoader()方法加载。

也有可能手动刷新通过在刷新ActionBarSherlock按钮列表。 然而,在完成另一项活动,其将记录添加到数据库后,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) {
}

问题是,在完成其他活动后, onLoaderCreate被调用,但onLoaderFinished不叫。

一些调试后,我发现, SimpleCursorAdapter.deliverResults()也称,芽上结束了.. if (isReset()) { ..

我缺少的东西吗? 如何强制数据的重载?

先感谢您

Answer 1:

我终于找到了解决这一问题多亏了讨论

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);
    }
}

另外作为支持库28确保你不会从内部调用initLoader Fragment.onCreate() 由于更新文档状态

您通常初始化加载该活动的中onCreate()方法,或片段的内onActivityCreated()方法。

看到https://developer.android.com/guide/components/loaders



Answer 2:

RAB解决方案不工作对我来说

我的工作方案 ,重新启动之前总是破坏装载机

Loader<Cursor> loader = mLoaderManager.getLoader(mKeyLoader);
if (loader != null)
{
    mLoaderManager.destroyLoader(mKeyLoader);
}
mLoaderManager.restartLoader(mKeyLoader, args, this);


Answer 3:

除了RAB的答案,如果你正在使用一个定制Loader ,确保如果调用super如果覆盖deliverResult()

@Override
public void deliverResult(D data) {
    super.deliverResult(data); // <--onLoadFinished() will not be called if you don't call this
    ...
}


Answer 4:

FWIW,我从试图立即重新启动加载器第二次,第一onLoadFinished调用前,导致没有被称为有类似的问题。

这个工作对我来说:

if( loader == null )
    loader = loaderMngr.initLoader(
        0, null, myLoaderCallbacks
        ); 
else if( loader.isAbandoned() )
    return;
else
    loaderMngr.restartLoader(
        0, null, myLoaderCallbacks
        );    


Answer 5:

检查library.Use此导入android.support.v4.app支持。 不要使用android.app.loadermanager。

import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;

初始化部分

    LoaderManager mLoaderManager=getSupportLoaderManager(); 

      LoaderManager.LoaderCallbacks<Cursor> mCursorLoaderCallbacks=new LoaderManager.LoaderCallbacks<Cursor>() {
                @Override
                public Loader<Cursor> onCreateLoader(int id, Bundle cursor) {
                      return new CursorLoader(getActivity(), MediaStore.Video.Media.EXTERNAL_CONTENT_URI, COLUMNS_OF_INTEREST, null, null,
                            MediaStore.Video.Media.DATE_ADDED + " DESC");
                }
                @Override
                public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
                }


                @Override
                public void onLoaderReset(Loader<Cursor> loader) {              
               }
            };

  mLoaderManager.initLoader(URL_LOADER_EXTERNAL, null, mCursorLoaderCallbacks);


文章来源: Android - onLoadFinished not called