Loaders和onLoaderReset Android

San*_*dra 11 android loader android-loadermanager

我在我的应用程序中实现了一个Loader来查询数据库中的数据.我通过实现LoaderCallbacks<Cursor>监听器来监听发生的变化.我遇到的问题是当onLoaderReset(Loader<Cursor> loader)我的数据发生变化时使用该方法,并且我想要使与加载器相关的任何数据无效并释放.在所有示例中,在此方法中有以下调用:

mAdapter.swapCursor(null);

但问题是我不使用适配器中光标的数据,我在我的应用程序中以其他方式使用它.

(onLoadFinished(Loader<Cursor> loader, Cursor data)例如,直接从返回的游标中)

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

            if (data.moveToFirst()) {
                TOTAL_CARDS = data.getCount();
                mView.createCards(TOTAL_CARDS);
            } else {
                TOTAL_CARDS = 0;
                mView.createCards(TOTAL_CARDS);
            }


        }
Run Code Online (Sandbox Code Playgroud)

这里要做的相应事情是什么,与...类似mAdapter.swapCursor.我对装载机没有多少经验,事实上我刚开始与他们合作,所以如果有人有解决方案,我会很感激.谢谢!

编辑:现在,我传递null到加载器,它的工作原理如下:

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

};
Run Code Online (Sandbox Code Playgroud)

但这是正确的解决方案吗?

Raf*_*ter 27

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

就像什么都不做一样好.在您的示例代码中,您只是将方法对其参数的本地引用置为null.但是,在返回方法调用后,将始终删除此引用.(您可能希望阅读Is Java"pass-by-reference"或"pass-by-value"?以进一步讨论该主题.)

onLoaderReset(Loader)当您的加载器的回调(通常是一个ActivityFragment实例)被要求释放之前Cursor获得的所有引用时,将调用该方法onLoadFinished(Loader, Cursor).基本上这种方法要求你清理,因为Loader它将很快关闭Cursor它之前提供给你的.光标关闭后,您将无法再通过它检索数据.但是,如果光标在CursorAdapter关闭后仍然在使用(通常由你提到的那个),这将导致抛出异常.

类似地,onLoadFinished(Loader, Cursor)有一个隐式契约,要求在方法返回之后,任何以前提供的Cursor对象都不能再使用.相反,您必须通过作为方法参数提供的新游标替换这些引用.相反,onLoaderReset(Loader)要求您履行相同的合同,但不提供替换,即您应删除以前检索的所有引用Cursor.

在您的示例中,您不会让您Cursor转义方法范围,而是立即读取数据.因此,没有必要删除对由于没有Cursor提供的对象的任何引用onLoadFinished(Loader, Cursor).onLoaderReset(Loader)因此,实现接口合同的空实现将为您完成工作.

  • 那么实现onLoaderReset()方法的好用例是什么? (5认同)