Android onLoadFinished与onLoaderReset回调详解及实例 onLoadFinished 这个方法是在前面已创建的加载器已经完成其加载过程后被调用,这个方法保证会在应用到加载器上的数据被释放之前被调用。在此方法中,你必须删除所有对旧数据的使用(因为它将很快会被删除),但是不要自己去释放它们,因为它们的加载器会做这些事情。 加载器一旦了解到应用不再使用数据时,将马上释放这些数据。例如,如果数据是一个从CursorLoader来的游标,你不应调用游标的close(),如果游标被放置在一个CursorAdapter中,你应使用swapCursor()方法,以使旧的游标不被 在Android开发中,Loader是一种强大的工具,用于异步加载数据并管理数据的生命周期。LoaderManager是Loader的管理者,它负责创建、恢复和销毁Loader。在处理动态数据源,特别是涉及到数据库查询,如Contacts Content Provider时,Loader是必不可少的组件。本文将深入探讨`onLoadFinished`和`onLoaderReset`这两个LoaderManager的回调方法,并提供一个实际的例子来展示如何在Fragment中使用它们。 `onLoadFinished`方法是在Loader完成数据加载后调用的。在这个回调中,你应该将新加载的数据应用到UI上,例如将新的Cursor传递给CursorAdapter。重要的是,不要在`onLoadFinished`中释放旧数据,因为Loader会自动处理数据的清理工作。例如: ```java @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // 将新的Cursor替换到Adapter中,Loader会自动处理旧Cursor的关闭 mAdapter.swapCursor(data); } ``` `onLoaderReset`方法在Loader的数据将被重置或无效时调用,比如当Loader被重新启动或者数据源发生变化时。在这个回调中,你需要清除对旧数据的所有引用,以防止内存泄漏。通常,你会使用`swapCursor(null)`来移除CursorAdapter中的Cursor: ```java @Override public void onLoaderReset(Loader<Cursor> loader) { // 清除Adapter中的Cursor引用,防止内存泄漏 mAdapter.swapCursor(null); } ``` 下面是一个使用CursorLoader的完整Fragment示例,该示例展示如何从联系人ContentProvider查询数据并将其显示在ListView中: ```java public static class CursorLoaderListFragment extends ListFragment implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> { private SimpleCursorAdapter mAdapter; private String mCurFilter; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // 初始化Adapter和ListView的其他设置 getLoaderManager().initLoader(0, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // 创建CursorLoader,指定ContentProvider Uri和查询条件 Uri uri = ContactsContract.Contacts.CONTENT_URI; String[] projection = { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS }; return new CursorLoader(getActivity(), uri, projection, null, null, null); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // 将新数据应用到Adapter mAdapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { // 清除旧数据引用 mAdapter.swapCursor(null); } // 其他方法,如onOptionsItemSelected、onQueryTextSubmit和onQueryTextChange等 } ``` 在这个示例中,Fragment实现了`LoaderManager.LoaderCallbacks<Cursor>`接口,因此可以接收`onLoadFinished`和`onLoaderReset`回调。`onCreateLoader`方法创建了CursorLoader,指定查询的ContentProvider Uri和字段。这样,当数据加载完成后,`onLoadFinished`会被调用,将新数据应用到Adapter;当数据需要重置时,`onLoaderReset`将被调用来清理旧数据。 `onLoadFinished`和`onLoaderReset`是LoaderManager的重要回调,它们帮助开发者在数据加载过程中正确地管理和更新UI,确保数据生命周期的正确管理,同时避免内存泄漏。通过使用Loader和LoaderManager,我们可以创建高效且响应迅速的Android应用,即使在数据变化时也能保持良好的用户体验。
- 粉丝: 4
- 资源: 949
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助