Pik*_*ing 6 android loader android-asynctask android-loadermanager
我的AsyncTaskLoader遇到了一些问题,不确定它们是否相关,因为它们在尝试重新启动Loader时都会发生.在我的应用程序中,我有3个自定义CursorAdapter实例,由3个由1个singleton LoaderManager管理的自定义AsyncTaskLoader实例支持.这些问题与两个不同的Adapter/Loader对有关,但在每种情况下使用的代码都是相同的:
getLoaderManager().restartLoader(loaderId, bundle, loaderManager);
Run Code Online (Sandbox Code Playgroud)
问题1:我调用restartLoader()并且LoaderManager注册了对onCreateLoader的调用,但没有注册到onLoaderReset().Loader获取deliverResult(),但永远不会调用onLoadFinished().Loader既没有设置'reset'或'started'标志(参见下面的代码).
问题2:我调用restartLoader()并且LoaderManager注册了对onLoaderReset()的调用.Loader获取onReset(),但没有进一步.Cursor设置为null,但没有加载新的Cursor.
任何想法可能是什么问题?以下是Loader和Loader Manager的一些代码:
CustomCursorLoader.java
@Override
protected void onStartLoading() {
Log.v(TAG, "Starting Loader");
if (lastCursor != null) {
deliverResult(lastCursor);
}
if (takeContentChanged() || lastCursor == null) {
forceLoad();
}
}
@Override
public void deliverResult(Cursor cursor) {
Log.v(TAG, "Delivering result");
if (isReset()) {
Log.v(TAG, "reset");
if (cursor != null) {
cursor.close();
}
return;
}
Cursor oldCursor = lastCursor;
lastCursor = cursor;
if (isStarted()) {
Log.v(TAG, "started");
super.deliverResult(cursor);
}
if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) {
oldCursor.close();
}
}
@Override
protected void onReset() {
Log.v(TAG, "Reset");
super.onReset();
onStopLoading();
if (lastCursor != null && !lastCursor.isClosed()) {
lastCursor.close();
}
lastCursor = null;
}
Run Code Online (Sandbox Code Playgroud)
CustomCursorLoaderManager.java:
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
return new CustomCursorLoader();
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
cursorAdapter.changeCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
cursorAdapter.changeCursor(null);
}
Run Code Online (Sandbox Code Playgroud)
您所说的“LoaderManager”实际上是该LoaderManager.LoaderCallbacks<D>
接口的实现。您可能想使用不同的名称,这个名称很令人困惑。为什么是单例呢?它通常与 Activity 或 Fragment 绑定,可能只是实现接口的 Activity/Fragment。您在哪里创建加载器(活动/片段)?还要确保您LoaderManager.initLoader()
从调用onCreate()/onActivityCreated()
,否则加载程序可能无法正常启动。
归档时间: |
|
查看次数: |
5279 次 |
最近记录: |