gpt4 book ai didi

android - 自定义 AsyncTaskLoader 回调的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:40:36 27 4
gpt4 key购买 nike

我的 AsyncTaskLoader 有几个问题,不确定它们是否相关,因为它们都是在尝试重新启动加载程序时发生的。在我的应用程序中,我有 3 个自定义 CursorAdapter 实例,由 1 个单例 LoaderManager 管理的 3 个自定义 AsyncTaskLoader 实例支持。问题与两个不同的 Adapter/Loader 对有关,但在每种情况下使用的代码都是相同的:

getLoaderManager().restartLoader(loaderId, bundle, loaderManager);

问题 1:我调用了 restartLoader(),LoaderManager 注册了对 onCreateLoader 的调用,但没有注册到 onLoaderReset()。 Loader 到达 deliverResult(),但永远不会调用 onLoadFinished()。加载程序既没有设置“重置”标志也没有设置“启动”标志(请参见下面的代码)。

问题 2:我调用 restartLoader() 并且 LoaderManager 注册了对 onLoaderReset() 的调用。 Loader 到达 onReset(),但不再继续。 Cursor 设置为 null,但没有加载新的 Cursor。

任何想法可能是什么问题?以下是加载程序和加载程序管理器的一些代码:

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

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

最佳答案

您所说的“LoaderManager”实际上是 LoaderManager.LoaderCallbacks<D> 的一个实现界面。您可能想使用不同的名称,这个名称令人困惑。为什么是单例?它通常绑定(bind)到 Activity 或 Fragment,可能只是实现接口(interface)的 Activity/Fragment。您在哪里创建加载程序( Activity/fragment )?还要确保您调用 LoaderManager.initLoader()来自 onCreate()/onActivityCreated() ,否则加载程序可能无法正常启动。

关于android - 自定义 AsyncTaskLoader 回调的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7153246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com