本站已关停,现有内容仅作科研等非赢利用途使用。特此声明。
查看: 723|回复: 0
打印 上一主题 下一主题

Android菜鸟饭团#Udacity Android#第十三课 活动笔记

[复制链接]
跳转到指定楼层
1#
发表于 2015-6-23 14:29:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Android菜鸟饭团#Udacity Android#第十三课 活动笔记

Content Providers
使用ContentProvider的好处是开发人员不需要考虑数据内部是怎么存储的,比如说如果我们想利用ContenProvider来存数据,只需告诉insert函数该ContentProvider的uri和想存入的数据(包括列名和数值),查询时也是一样,只需输入Uri和查询的表,列名和查询条件,至于ContentProvider里面是怎么进行这些操作的我们不需要知道使用ContentProvider的好处是开发人员不需要考虑数据内部是怎么存储的,比如说如果我们想利用ContenProvider来存数据,只需告诉insert函数该ContentProvider的uri和想存入的数据(包括列名和数值),查询时也是一样,只需输入Uri和查询的表,列名和查询条件,至于ContentProvider里面是怎么进行这些操作的我们不需要知道。ContentProvider在程序操作中所提供的是一个操作的标准,所以如果想要依靠此标准进行数据操作,必须使用android.content.ContentResolver 类完成,该类所给出的操作方法与ContentProvider是一一对应的,当用户调用时实际就相当于掉用ContentProvider类的常用方法;但是,由于ContentProvider是一个抽象类,所以要想取得ContentProvider类中的实例化对象进行操作,需要依靠android.app.Activity类中的public ContentResolver getContentResolver()方法

Content Providers        数据共享原理
当一个应用需要公开共享它的数据时,可以通过创建自己的content providers然后通过Manifest把content providers注册到android系统,然后其他应用通过contentresolver访问content providers的uri来操作指定的content providers,实际上,contentresolver就是相当于content providers的一个代理,其它应用程序通过contentresolver访问共享的content providers。content providers是单例对象,既它只创建一次,后面对它的访问都是同一个实例
优点:使用ContentProvider对外共享数据的好处是统一了数据的访问方式!

Loader(装载器)
装载器从android3.0开始引进。它使得在activity或fragment中异步加载数据变得简单。装载器具有如下特性:它们对每个Activity和Fragment都有效。他们提供了异步加载数据的能力。它们监视数据源的一将一动并在内容改变时传送新的结果。当由于配置改变而被重新创建后,它们自动重连到上一个加载器的游标,所以不必重新查询数据。
一个执行异步数据加载的抽象类。它是加载器的基类。你可以使用典型的CursorLoader,但是你也可以实现你自己的子类。一旦装载器被激活,它们将监视它们的数据源并且在数据改变时发送新的结果。
Loader主要是用来避免UI线程中直接读取数据库

CursorLoader
AsyncTaskLoader的子类,它查询ContentResolver然后返回一个Cursor。这个类为查询cursor以标准的方式实现了装载器的协议,它的游标查询是通过AsyncTaskLoader在后台线程中执行,从而不会阻塞界面。ContentProvider异步加载数据的最好方式。相比之下,通过fragment或activity的API来执行一个被管理的查询就不行了。

创建CursorLoader
创建CursorLoader三部曲:
  • 先创建一个整形常量作为Loader ID
  • 然后实现Loader回调函数
  • 最后使用LoaderMannger初始化Loader

LoaderManager
一个抽像类,关联到一个Activity或Fragment,管理一个或多个装载器的实例。这帮助一个应用管理那些与Activity或Fragment的生命周期相关的长时间运行的的操作。最常见的方式是与一个CursorLoader一起使用,然而应用是可以随便写它们自己的装载器以加载其它类型的数据。
每个activity或fragment只有一个LoaderManager。但是一个LoaderManager可以拥有多个装载器

LoaderManager
介绍几个LoaderManager提供的方法,用于管理Loader:
  • Loader<D> initLoader(int id,Bundle bundle,LoaderCallbacks<D> callback):初始化一个Loader,并注册回调事件。
  • Loader<D> restartLoader(int id,Bundle bundle,LoaderCallbacks<D> callback):重新启动或创建一个Loader,并注册回调事件。
  • Loader<D> getLoader(int id):返回给定Id的Loader,如果没有找到则返回Null。
  • void destroyLoader(int id):根据指定Id,停止和删除Loader。
通过上面几个方法的参数可以看到,都有一个id参数,这个Id是Loader的标识,因为LoaderManager可以管理一个或多个Loader,所以必须通过这个Id参数来唯一确定一个Loader。而InitLoader()、restartLoader()中的bundle参数,传递一个Bundle对象给LoaderCallbacks中的onCreateLoader()去获取,下面介绍LoaderCallbacks。


LoaderManager and LoaderCallbacks
LoaderCallbacks是LoaderManager和Loader之间的回调接口。它是一个回调接口,所以我们需要实现其定义的三个方法:

  • Loader<D> onCreateLoader(int id,Bundle bundle):根据指定Id,初始化一个新的Loader。
  • void onLoadFinished(Loader<D> loader,D data):当Loader被加载完毕后被调用,在其中处理Loader获取的Cursor数据。
  • void onLoaderReset(Loader<D> loader):当Loader被销毁的时候被调用,在其中可以使Loader的数据不可用。

从LoaderCallbacks的声明的几个方法中可以看到,它是一个泛型的接口,需要指定Loader数据的类型。如果是数据源是从一个ContentProvider中获取的,一般直接使用它的子类CursorLoader,下面介绍CursorLoader。

SimpleCursorAdapter
在Android中,数据的展示都需要使用一个Adapter适配器,而Loader一般返回的就是一个Cursor的数据,可以使用BaseAdapter的一个子类SimpleCursorAdapter,它可以使用XML资源文件自定义一个布局在展示数据。它有两个构造函数,但是有一个构造函数在API Level11之后就不推荐使用。下面是构造函数的签名:
SimpleCursorAdapter(Context context,int layout,Cursor c,String[] from,int[] to,int flags).
最后一个参数flags是一个标识,标识当数据改变调用onContentChanged()的时候,是否通知ContentProvider数据的改变,如果无需监听ContentProvider的改变,则可以传0。对于SimpleCursorAdapter适配器的Cursor的改变,可以使用SimpleCursorAdapter.swapCursor(Cursor)方法,它会与旧的Cursor互换,并且返回旧的Cursor。

onCreateLoader
当你试图去操作一个装载器时(比如,通过initLoader()),会检查是否指定ID的装载器已经存在.如果它不存在,将会触发LoaderManager.LoaderCallbacks 的方法onCreateLoader().这是你创建一个新装载器的地方.通常这个装载器是一个CursorLoader,但是你也可以实现你自己的装载器.
在下面的例子中,回调方法onCreateLoader() 创建一个CursorLoader.你必须使用构造方法来建立CursorLoader ,构造方法需要向ContentProvider执行一次查询的完整信息作为参数,它尤其需要:
uri —要获取的内容的URI.
projection —要返回的列组成的列被.传入null 将会返回所有的列,但这是低效的.
selection —一个过滤器,表明哪些行将被返回.格式化成类似SQLWHERE 语句的样子(除了没有WHERE).传入null 将返回所有的行.
selectionArgs —你可以在selection 中包含一些'?',它将被本参数的值替换掉.这些值出现的顺序与'?'在selection中出现的顺序一至.值将作为字符串.
sortOrder —如何为行们排序.格式化成类似于SQLORDER BY 语句的样字(除了没有ORDERBY).传入null将使用默认顺序,默认顺序可能是无顺序.

onLoadFinished
这个方法是在前面已创建的装载器已经完成其加载过程后被调用.这个方法保证会在应用到装载器上的数据被释放之前被调用.在此方法中,你必须删除所有对旧数据的使用(因为它将很快会被删除),但是不要自己去释放它们,因为它们的装载器会做这些事情.
装载器一旦了解到应用不再使用数据时,将马上释放这些数据.例如,如果数据是一个从CursorLoader来的游标,你不应调用游标的close().如果游标被放置在一个CursorAdapter中,你应使用swapCursor()方法,以使旧的游标不被关闭.

【书记员:赵杰】
每一个技术小白都有一个成为大神的梦想,现在Android菜鸟饭团就给你这个成就梦想的机会。我们提供最新的Android技术教学,只要你又耐心和毅力就一定会在这里有所收获。
Android菜鸟饭团南阳GDG组织发起,秉承着开放、分享、创新的原则,希望通过GDG社区的力量能够给更多的想要学习Android开发技术的小白们创造一个学习,交流,分享的环境。同往常的GDG活动一样,我们依然是任性的一个子都不要,并且还在周六的分享中提供盒饭和不定期的惊喜小礼物呦~所以快来加入我们吧,为你的大神梦想迈出第一步。
把你的个人信息和申请理由快快发送到android@chuang1.net,前来加入我们吧



ChinaGDG.com
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表