- 浏览: 2205475 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
这篇文章将介绍LoaderManager类,这是该系列的第二篇文章。
一:Loaders之前世界
二:了解LoaderManager
三:实现Loaders
四:实例:AppListLoader
注意:
要了解这一LoaderManager这部分知识,要求对Loaders如何工作有基本了解。Loaders的实现将在下一篇文章中涵盖。现在你只需要将Loaders看成一个简单、字包含的对象。该对象特性包括:1.在一个单独线程载入数据;2.监测底层数据源,当探测到有改变时就更新或者重新查询。了解上面的Loader相关内容就足以了解本文内容了。下文所有的Loaders假设100%正确。
LoaderManager是什么?
简单的理解是,LoaderManager用来负责管理与Activity或者Fragment联系起来的一个或多个Loaders对象。每个Activity或者Fragment都有唯一的一个LoaderManager实例,用来启动、停止、保持、重启、关闭它的Loaders。这些事件有时直接在客户端通过调用initLoader()/restartLoader()/destroyLoader()函数来实现。通常这些事件通过主要的Activity/Fragment声明周期事件来触发,而不是手动(当然也可以手动调用)。比如,当一个Activity关闭时(destroyed),改活动将指示它的LoaderManager来销毁并且关闭它的Loaders(当然也会销毁并关闭与这些Loaders关联的资源,比如Cursor)。
LoaderManager并不知道数据如何装载以及何时需要装载。相反地,LoaderManager只需要控制它的Loaders们开始、停止、重置他们的Load行为,在配置变换(比如横竖屏切换)时保持loaders们的状态,并提供一个简单的接口来获取load结果到客户端中。从上面的行为可以看到,LoaderManager是一个比现在过时的startManagingCursor方法更加智能和通用的方法。在Activity的声明周期状态轮转中,比较两种管理数据的方法,可以发现LoaderManager方法有下面几个方面更胜一筹:
1. startManagingCursor管理Cursors,而LoaderManager管理Loader<D>对象。Loader<D>是一个模板类,D是一个包含了需要载入数据的类。也就是说,数据源并不必须是Cursor,它可以是List、JSONArray。。。任何类。LoaderManager与它包含的数据内容解耦了,所以更加灵活。
2. 调用startManagingCursor会导致Activity在已经加入管理的Cursor上调用requery()方法。在第一篇文章中提到过,在UI线程执行requery()方法代价非常高。相反的是,Loader<D>的子类会异步载入(译者注:另外再开一个线程,就叫异步了。)数据,所以使用LoaderManager永远不会产生阻塞UI线程的情况。
3. startManagingCursor在配置变化(例如横竖屏切换)时,并不会保持Cursor的状态。麻烦的是,每次Activity由于配置变化(比如,简单的横竖屏切换),都会导致Cursor下回并且被重新查询。LoaderManager就智能多了,当配置变化时,它会保持它里面的Loader们的状态,所以并不需要重新查询数据。
4. LoaderManager提供无缝的数据监测。任何时候,当Loader的数据源改变,LoaderManager将会从对应的Loader上面接收到一个新的同步载入数据,并将更新数据返回给客户端(注意:仅当Loader被正确实现,LoaderManager才会接收到这些数据变化通知。我们将会在该系列的第三篇文章讨论自定义Loaders的实现)。
如果你觉得上面很难,我也并不会强调她。上面的内容最重要的是LoaderManager让你的生活更容易。LoaderManager为你初始化、管理、销毁Loaders,减少了代码复杂度和与Activity或者Fragment生命周期相关的bug。更多地,与LoaderManager交互需要实现三个简单的回调方法,我们在下一节将讨论LoaderManager.LoaderCallbacks<D>。
实现LoaderManager.LoaderCallbacks<D>接口
LoaderManager.LoaderCallbacks<D>接口LoaderManager用来向客户返回数据的方式。每个Loader都有自己的回调对象供与LoaderManager进行交互。该回调对象在实现LoaderManager中地位很高,告诉LoaderManager如何实例化Loader(onCreateLoader),以及当载入行为结束或者重启(onLoadFinished或者onLoadReset)之后执行什么操作。大多数情况,你需要把该接口实现为组件的一部分,比如说让你的Activity或者Fragment实现LoadManager.LoaderCallbacks<D>接口。
一旦实现该接口,客户端将回调对象(本例中为“this”)作为LoaderManager的initLoader函数的第三个参数传输。
总的来说,实现回调接口非常直接明了。每个回调方法都有各自明确的与LoaderManager进行交互的目的:
1. onCreateLoader是一个工厂方法,用来返回一个新的Loader。LoaderManager将会在它第一次创建Loader的时候调用该方法。
2. onLoadFinished方法将在Loader创建完毕的时候自动调用。典型用法是,当载入数据完毕,客户端(译者注:调用它的Activity之类的)需要更新应用UI。客户端假设每次有新数据的时候,新数据都会返回到这个方法中。记住,检测数据源是Loader的工作,Loader也会执行实际的同步载入操作。一旦Loader载入数据完成,LoaderManager将会接受到这些载入数据,并且将将结果传给回调对象的onLoadFinished方法,这样客户端(比如Activity或者Fragment)就能使用该数据了。
3. 最后,当Loader们的数据被重置的时候将会调用onLoadReset。该方法让你可以从就的数据中移除不再有用的数据。
在下一节中,我们将讨论Android初学者们经常问到的问题:如何从过时的Managed Cursor转移到更强大的LoaderManager来?
从Managed Cursor转移到LoaderManager
下面的代码跟上一篇文章的代码实现的功能类似。当然,不同就是改成使用LoaderManager来实现。CursorLoader确保所有的查询都是异步执行,这确保了我们不会阻塞UI线程。更进一步,LoaderManager在Activity全生命周期管理CursorLoader,当配置转换时保持它的数据。处理每次新数据在回调接口的onLoadFinished方法中的载入。这样Activity可以很自由的使用查询结果。
总结
正如其名LoaderManager,它负责在Activity或者Fragment的生命周期内管理Loader们。LoaderManager很简单,并且它的实现代码量通常很少。
一:Loaders之前世界
二:了解LoaderManager
三:实现Loaders
四:实例:AppListLoader
注意:
要了解这一LoaderManager这部分知识,要求对Loaders如何工作有基本了解。Loaders的实现将在下一篇文章中涵盖。现在你只需要将Loaders看成一个简单、字包含的对象。该对象特性包括:1.在一个单独线程载入数据;2.监测底层数据源,当探测到有改变时就更新或者重新查询。了解上面的Loader相关内容就足以了解本文内容了。下文所有的Loaders假设100%正确。
LoaderManager是什么?
简单的理解是,LoaderManager用来负责管理与Activity或者Fragment联系起来的一个或多个Loaders对象。每个Activity或者Fragment都有唯一的一个LoaderManager实例,用来启动、停止、保持、重启、关闭它的Loaders。这些事件有时直接在客户端通过调用initLoader()/restartLoader()/destroyLoader()函数来实现。通常这些事件通过主要的Activity/Fragment声明周期事件来触发,而不是手动(当然也可以手动调用)。比如,当一个Activity关闭时(destroyed),改活动将指示它的LoaderManager来销毁并且关闭它的Loaders(当然也会销毁并关闭与这些Loaders关联的资源,比如Cursor)。
LoaderManager并不知道数据如何装载以及何时需要装载。相反地,LoaderManager只需要控制它的Loaders们开始、停止、重置他们的Load行为,在配置变换(比如横竖屏切换)时保持loaders们的状态,并提供一个简单的接口来获取load结果到客户端中。从上面的行为可以看到,LoaderManager是一个比现在过时的startManagingCursor方法更加智能和通用的方法。在Activity的声明周期状态轮转中,比较两种管理数据的方法,可以发现LoaderManager方法有下面几个方面更胜一筹:
1. startManagingCursor管理Cursors,而LoaderManager管理Loader<D>对象。Loader<D>是一个模板类,D是一个包含了需要载入数据的类。也就是说,数据源并不必须是Cursor,它可以是List、JSONArray。。。任何类。LoaderManager与它包含的数据内容解耦了,所以更加灵活。
2. 调用startManagingCursor会导致Activity在已经加入管理的Cursor上调用requery()方法。在第一篇文章中提到过,在UI线程执行requery()方法代价非常高。相反的是,Loader<D>的子类会异步载入(译者注:另外再开一个线程,就叫异步了。)数据,所以使用LoaderManager永远不会产生阻塞UI线程的情况。
3. startManagingCursor在配置变化(例如横竖屏切换)时,并不会保持Cursor的状态。麻烦的是,每次Activity由于配置变化(比如,简单的横竖屏切换),都会导致Cursor下回并且被重新查询。LoaderManager就智能多了,当配置变化时,它会保持它里面的Loader们的状态,所以并不需要重新查询数据。
4. LoaderManager提供无缝的数据监测。任何时候,当Loader的数据源改变,LoaderManager将会从对应的Loader上面接收到一个新的同步载入数据,并将更新数据返回给客户端(注意:仅当Loader被正确实现,LoaderManager才会接收到这些数据变化通知。我们将会在该系列的第三篇文章讨论自定义Loaders的实现)。
如果你觉得上面很难,我也并不会强调她。上面的内容最重要的是LoaderManager让你的生活更容易。LoaderManager为你初始化、管理、销毁Loaders,减少了代码复杂度和与Activity或者Fragment生命周期相关的bug。更多地,与LoaderManager交互需要实现三个简单的回调方法,我们在下一节将讨论LoaderManager.LoaderCallbacks<D>。
实现LoaderManager.LoaderCallbacks<D>接口
LoaderManager.LoaderCallbacks<D>接口LoaderManager用来向客户返回数据的方式。每个Loader都有自己的回调对象供与LoaderManager进行交互。该回调对象在实现LoaderManager中地位很高,告诉LoaderManager如何实例化Loader(onCreateLoader),以及当载入行为结束或者重启(onLoadFinished或者onLoadReset)之后执行什么操作。大多数情况,你需要把该接口实现为组件的一部分,比如说让你的Activity或者Fragment实现LoadManager.LoaderCallbacks<D>接口。
public class SampleActivity extends Activity implements LoaderManager.LoaderCallbacks<D> { public Loader<D> onCreateLoader(int id, Bundle args) { ... } public void onLoadFinished(Loader<D> loader, D data) { ... } public void onLoaderReset(Loader<D> loader) { ... } /* ... */ }
一旦实现该接口,客户端将回调对象(本例中为“this”)作为LoaderManager的initLoader函数的第三个参数传输。
总的来说,实现回调接口非常直接明了。每个回调方法都有各自明确的与LoaderManager进行交互的目的:
1. onCreateLoader是一个工厂方法,用来返回一个新的Loader。LoaderManager将会在它第一次创建Loader的时候调用该方法。
2. onLoadFinished方法将在Loader创建完毕的时候自动调用。典型用法是,当载入数据完毕,客户端(译者注:调用它的Activity之类的)需要更新应用UI。客户端假设每次有新数据的时候,新数据都会返回到这个方法中。记住,检测数据源是Loader的工作,Loader也会执行实际的同步载入操作。一旦Loader载入数据完成,LoaderManager将会接受到这些载入数据,并且将将结果传给回调对象的onLoadFinished方法,这样客户端(比如Activity或者Fragment)就能使用该数据了。
3. 最后,当Loader们的数据被重置的时候将会调用onLoadReset。该方法让你可以从就的数据中移除不再有用的数据。
在下一节中,我们将讨论Android初学者们经常问到的问题:如何从过时的Managed Cursor转移到更强大的LoaderManager来?
从Managed Cursor转移到LoaderManager
下面的代码跟上一篇文章的代码实现的功能类似。当然,不同就是改成使用LoaderManager来实现。CursorLoader确保所有的查询都是异步执行,这确保了我们不会阻塞UI线程。更进一步,LoaderManager在Activity全生命周期管理CursorLoader,当配置转换时保持它的数据。处理每次新数据在回调接口的onLoadFinished方法中的载入。这样Activity可以很自由的使用查询结果。
public class SampleListActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> { private static final String[] PROJECTION = new String[] { "_id", "text_column" }; // The loader's unique id. Loader ids are specific to the Activity or // Fragment in which they reside. private static final int LOADER_ID = 1; // The callbacks through which we will interact with the LoaderManager. private LoaderManager.LoaderCallbacks<Cursor> mCallbacks; // The adapter that binds our data to the ListView private SimpleCursorAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String[] dataColumns = { "text_column" }; int[] viewIDs = { R.id.text_view }; // Initialize the adapter. Note that we pass a 'null' Cursor as the // third argument. We will pass the adapter a Cursor only when the // data has finished loading for the first time (i.e. when the // LoaderManager delivers the data to onLoadFinished). Also note // that we have passed the '0' flag as the last argument. This // prevents the adapter from registering a ContentObserver for the // Cursor (the CursorLoader will do this for us!). mAdapter = new SimpleCursorAdapter(this, R.layout.list_item, null, dataColumns, viewIDs, 0); // Associate the (now empty) adapter with the ListView. setListAdapter(mAdapter); // The Activity (which implements the LoaderCallbacks<Cursor> // interface) is the callbacks object through which we will interact // with the LoaderManager. The LoaderManager uses this object to // instantiate the Loader and to notify the client when data is made // available/unavailable. mCallbacks = this; // Initialize the Loader with id '1' and callbacks 'mCallbacks'. // If the loader doesn't already exist, one is created. Otherwise, // the already created Loader is reused. In either case, the // LoaderManager will manage the Loader across the Activity/Fragment // lifecycle, will receive any new loads once they have completed, // and will report this new data back to the 'mCallbacks' object. LoaderManager lm = getLoaderManager(); lm.initLoader(LOADER_ID, null, mCallbacks); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // Create a new CursorLoader with the following query parameters. return new CursorLoader(SampleListActivity.this, CONTENT_URI, PROJECTION, null, null, null); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { // A switch-case is useful when dealing with multiple Loaders/IDs switch (loader.getId()) { case LOADER_ID: // The asynchronous load is complete and the data // is now available for use. Only now can we associate // the queried Cursor with the SimpleCursorAdapter. mAdapter.swapCursor(cursor); break; } // The listview now displays the queried data. } @Override public void onLoaderReset(Loader<Cursor> loader) { // For whatever reason, the Loader's data is now unavailable. // Remove any references to the old data by replacing it with // a null Cursor. mAdapter.swapCursor(null); } }
总结
正如其名LoaderManager,它负责在Activity或者Fragment的生命周期内管理Loader们。LoaderManager很简单,并且它的实现代码量通常很少。
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 636本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1113颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 1005从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1181Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 1020Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 848前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 937监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 808在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 979最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1344##MediaQuery MediaQuery.of(con ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 1145当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 793setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1530问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 782底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1792点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1384import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2340TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1567一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 880Flutter最近很火,我抽出了一点时间对Flutter进行了 ... -
关于android O 上 NotificationChannel 的一些注意事项
2019-07-04 11:47 942最近在适配android O,遇到个问题,应用中原本有设置界面 ...
相关推荐
在Android应用中,通常使用ContentProvider、CursorLoader和LoaderManager来管理和展示SQLite数据。ContentProvider是Android中数据共享的标准接口,它封装了对SQLite数据库的操作。CursorLoader负责异步加载数据,...
在Android应用开发中,从第二...通过学习和实践这些章节,开发者可以建立起坚实的Android开发基础,进一步探索更高级的主题,如Fragment、Loader、LoaderManager、ViewModel、LiveData等,以提升应用的性能和用户体验。
《Android Support Library详解:v7-appcompat与v4.jar》 在Android开发中,为了保持应用的兼容性和向后兼容性,Google提供了Android Support Library。这个库包含了多种组件和工具,帮助开发者创建能在多种Android...
- 使用LoaderManager和CursorLoader实现异步加载数据库数据到ListView或RecyclerView。 9. 数据备份与恢复: - 使用`sqlite3`命令行工具或Android的`SQLiteAssetHelper`库进行数据库导入导出。 - 应用升级时,...
《Android Support Library v13详解》 Android Support Library v13是Google为Android开发者提供的一套重要的库,它旨在帮助开发者实现对早期Android版本的兼容性,同时也包含了一些额外的功能和改进。这个库的核心...
《Android Support Library v7 AppCompat详解》 在Android开发中,`android-support-v7-appcompat`是一个至关重要的库,它是Android Support Library的一部分,为开发者提供了对Android API版本的向下兼容,使得...
3. **使用Loader**:通过`LoaderManager`来启动和管理Loader,使用`LoaderCallbacks`接口实现Loader的生命周期回调。 4. **配置ViewPager**:创建`PagerAdapter`子类,如`FragmentPagerAdapter`或`...
`LoaderManager`可以帮助我们管理和启动`CursorLoader`。 8. **优化性能** 使用`UriMatcher`进行精确匹配,减少不必要的资源消耗。在处理大量数据时,考虑使用`Loader`或`AsyncTask`,避免主线程阻塞。 总结,...
- 使用CursorLoader进行数据加载,它可以配合LoaderManager实现数据的懒加载和更新通知。 - 对于敏感数据,考虑加密存储以提高安全性。 - 为ContentProvider的各个操作添加日志,便于调试和性能优化。 通过学习...
《Android Support Library v4详解》 在Android应用开发中,Android Support Library v4是一个至关重要的组件,它为早期版本的Android提供了对新API特性的向下兼容。标题中的"android-support-v4-25.zip"指的是v4...
《Android Support Library v4详解及应用》 在Android开发中,`android-support-v4`库是一个至关重要的组件,尤其对于支持向后兼容性和提供额外功能来说。这个库旨在帮助开发者处理Android不同版本间的差异,使其...
【第一版第十二章】老罗Android开发视频--菜单的使用(4集) 【第一版第十三章】老罗Android开发视频--异步加载数据库(2集) 【第一版第十四章】老罗Android开发视频--多线程编程(7集) 【第一版第十五章】老罗...
- 使用AsyncTaskLoader配合LoaderManager,实现数据异步加载,避免阻塞UI线程。 - 注意ListView的可见项数量,避免一次性加载大量数据。 通过以上知识点的学习,开发者可以熟练地在Android应用中运用ListView,...
- 使用`LoaderManager`异步加载数据,避免阻塞UI线程。 - 对大量数据操作时,考虑使用事务以提高效率。 9. **安全与隐私** - 用户的联系人信息应妥善保护,遵循Android的权限管理,只在用户授权后访问。 - ...
**Android Support Library v4详解** Android Support Library v4(以下简称v4库)是Google为开发者提供的一款重要工具,旨在帮助开发者实现对早期Android版本的兼容性。这个库包含了一组API,这些API在某些Android...
**Android Support Library v4详解** Android Support Library v4是一个重要的组件,它为Android应用程序提供了向后兼容的功能。这个库使得开发者能够使用最新的API特性,即使目标设备运行的是早期版本的Android...
《Android Support Library 4.0详解》 在Android开发领域,`android-support-4.0.jar`是一个至关重要的组件,它是Google为支持早期版本Android设备而推出的Android Support Library的第4.0版本。这个库的存在使得...
- **CursorLoader与LoaderManager**:使用Loader管理器能有效地管理数据加载,避免内存泄漏,并在数据变化时自动刷新UI。 7. **SQLite数据库安全性** - **加密数据库**:可以使用第三方库如SQLCipher来对SQLite...
在Android开发领域,掌握各个组件的使用是至关重要的。Android系统主要由四大组件构成:Activity、Service、BroadcastReceiver和ContentProvider。这些组件是构建应用程序的基础,理解它们的工作原理和交互方式,能...