mAdapter.swapCursor(NULL);
但是事情是我不使用光标在适配器中的数据,我以其他方式在我的应用程序中使用它.
(例如,直接从onLoadFinished(Loader< Cursor>加载器,Cursor数据)中的返回的游标)
@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); } }
在这里做相应的事情是什么,这与mAdapter.swapCursor类似.
我没有太多的装载机经验,其实我刚开始和他们一起工作,所以如果有人解决这个问题,我会很感激.谢谢!
编辑:
现在,我将null传递给加载器,它的工作原理如下:
@Override public void onLoaderReset(Loader<Cursor> loader) { loader = null; } };
但这是正确的解决方案吗?
解决方法
@Override public void onLoaderReset(Loader<Cursor> loader) { loader = null; }
和做什么一样好在您的示例代码中,您只是将方法的本地引用归零.但是,返回方法调用后,此引用将始终被删除. (您可能需要阅读Is Java “pass-by-reference” or “pass-by-value”?以进一步讨论该主题.)
当您的加载程序的回调(通常是一个Activity或Fragment实例)被要求释放通过onLoadFinished(Loader,Cursor)获取的Cursor的所有引用时,onLoaderReset(Loader)方法被调用.基本上,这种方法要求您清理,因为装载程序将很快关闭它提供给您的光标.光标关闭后,您将无法再通过它检索数据.如果光标在关闭之后仍然会被使用(通常由您所提到的CursorAdapter),这将导致抛出异常.
类似地,onLoadFinished(Loader,Cursor)有一个隐式合同,要求在方法返回任何以前提供的Cursor对象不能再使用之后.相反,您必须通过作为方法参数提供的新游标来替换这些引用.相比之下,onLoaderReset(Loader)要求您完成相同的合同,但不提供替换,即您应该删除对以前检索的Cursor的所有引用.
在您的示例中,您不要让Cursor转义方法范围,而是立即读取数据.因此,没有必要删除通过onLoadFinished(Loader,Cursor)提供的Cursor对象的任何引用,因为没有.因此,执行onLoaderReset(Loader)以实现接口合同的空的实现将为您做好工作.