当加载程序重新启动时,onLoadFinished并不总是被调用
我让我的用户将文件下载到云后,我希望我的应用程序重新启动加载程序。当加载程序重新启动时,onLoadFinished并不总是被调用
此前,onLoadFinished
并不总是被称为(随机),当我以下列方式
public void reloadAfterOpenFromCloud() {
LoaderManager loaderManager = this.getLoaderManager();
loaderManager.restartLoader(0, bundle, this);
}
写我的代码指的是讨论Android - onLoadFinished not called后,我修改我的代码
public void reloadAfterOpenFromCloud() {
// https://*.com/questions/16014992/android-onloadfinished-not-called
// This seems to be a realiable way, to make sure onCreateLoader and onLoadFinished will
// be called.
LoaderManager loaderManager = this.getLoaderManager();
Loader loader = loaderManager.getLoader(0);
if (loader != null) {
loaderManager.destroyLoader(0);
}
loaderManager.restartLoader(0, bundle, this);
}
这减少了不致电onLoadFinished
的机会。但是,它仍然会随机发生,如果我
- 做一个清除缓存,干净的卸载我的应用程序。
- 安装该应用。
- 运行
reloadAfterOpenFromCloud
。再次,随机地,onLoadFinished
将不会被调用。
当onLoadFinished
没有被调用,如果我再次运行reloadAfterOpenFromCloud
,onLoadFinished
将被调用。
我正在使用最新的com.android.support:support-v4:25.0.0
和targetSdkVersion 25
。
我在想,是否有任何可行的解决方法,以确保onLoadFinished
始终被调用,当加载程序重新启动?
下面是我的代码片段的一部分。
public void reloadAfterOpenFromCloud() {
// https://*.com/questions/16014992/android-onloadfinished-not-called
// This seems to be a realiable way, to make sure onCreateLoader and onLoadFinished will
// be called.
LoaderManager loaderManager = this.getLoaderManager();
Loader loader = loaderManager.getLoader(0);
if (loader != null) {
loaderManager.destroyLoader(0);
}
loaderManager.restartLoader(0, bundle, this);
}
static class HomeMenuRowInfosLoader extends AsyncTaskLoader<List<HomeMenuRowInfo>> {
private List<HomeMenuRowInfo> homeMenuRowInfos = null;
public HomeMenuRowInfosLoader(Context context) {
super(context);
}
@Override
public List<HomeMenuRowInfo> loadInBackground() {
...
return homeMenuRowInfos;
}
/**
* Handles a request to cancel a load.
*/
@Override
public void onCanceled(List<HomeMenuRowInfo> homeMenuRowInfos) {
super.onCanceled(homeMenuRowInfos);
}
/**
* Handles a request to stop the Loader.
* Automatically called by LoaderManager via stopLoading.
*/
@Override
protected void onStopLoading() {
// Attempt to cancel the current load task if possible.
cancelLoad();
}
/**
* Handles a request to start the Loader.
* Automatically called by LoaderManager via startLoading.
*/
@Override
protected void onStartLoading() {
if (this.homeMenuRowInfos != null) {
deliverResult(this.homeMenuRowInfos);
}
if (takeContentChanged() || this.homeMenuRowInfos == null) {
forceLoad();
}
}
/**
* Handles a request to completely reset the Loader.
* Automatically called by LoaderManager via reset.
*/
@Override
protected void onReset() {
super.onReset();
// Ensure the loader is stopped
onStopLoading();
// At this point we can release the resources associated with 'apps'
// if needed.
this.homeMenuRowInfos = null;
}
}
@Override
public Loader<List<HomeMenuRowInfo>> onCreateLoader(int arg0, Bundle bundle) {
return new HomeMenuRowInfosLoader(this.getActivity());
}
// Not being called always when restart loader
@Override
public void onLoadFinished(Loader<List<HomeMenuRowInfo>> arg0, List<HomeMenuRowInfo> homeMenuRowInfos) {
...
您需要实现某种观察员在HomeMenuRowInfosLoader
,将调用onContentChanged()
当用户完成云的文件传输。
如果onContentChanged()
不会被调用,takeContentChanged()
将始终返回false
和forceLoad()
不会被内onStartLoading()
此时homeMenuRowInfos
不等于空先装后调用。
我有调试。当“onLoadFinished未被调用”问题发生时调用'forceLoad'。 –
如果每个'restartLoader'都有匹配的'forceLoad',但没有获得'onLoadFinished',我不确定那是什么。在'loadInBackground'中,你是否总是使用'homeMenuRowInfos = new ArrayList ()'或者重用列表?我在'LoaderManager'中看到一些代码,如果新数据==先前的数据,它看起来会跳过'onLoadFinished'。 –
请为您的'HomeMenuRowInfosLoader'类添加完整的代码。当我调用onContentChanged()时,我特别感兴趣。 –
@krislarson我更新了代码。谢谢。 –