位置: 编程技术 - 正文
推荐整理分享xUtils 源码解析(istio源码解析),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:解析源码整套,licode 源码分析,@transactional源码解析,tikv源码分析,istio源码解析,@transactional源码解析,istio源码解析,istio源码解析,内容如对您有帮助,希望把文章链接给更多的朋友!
本文为 Android 开源项目源码解析 中 xUtils 部分。项目地址:xUtils,分析的版本:c2ac,Demo 地址:xUtils Demo分析者:Caij,校对者:maogy,校对状态:未完成
1. 功能介绍xUtils一个Android公共库框架,主要包括四个部分:View,Db, Http, Bitmap 四个模块。
View模块主要的功能是通过注解绑定UI,资源,事件。Db模块是一个数据库orm框架, 简单的语句就能进行数据的操作。Http模块主要访问网络,支持同步,异步方式的请求,支持文件的下载。Bitmap模块是加载图片以及图片的处理, 支持加载本地,网络图片。而且支持图片的内存和本地缓存。2. 详细设计2.1 View模块2.1.1 总体设计流程和关系较少, 请看下面的详细分析
2.1.2 流程图2.1.3 核心类功能介绍请先了解注解 ,动态代理 可以帮助到您, 如果已经了解请忽略。注解和反射知识是这个模块的主要内容
1.ViewUtils.javaView和各种事件的注入以及资源的注入。
(1)主要函数第一个参数Object handler代表的是需要注入的对象, 第二个参数是需要注入View(这个View就是handler的成员变量)所在的View或者Activity的包装对象。该方法完成了View和各种事件的注入以及资源的注入。主要的原理就是通过反射和注解。
完成Activity的setContentView。完成View的注入。完成资源的注入。完成各种事件的注入。2.ViewFinder.java(1)主要函数如果存在父View, 优先从父View寻找,否则从当前的View或者Activity中寻找。
3.ResLoader.java获取资源文件。支持多种资源的获取。
4.EventListenerManager.java事件的注入, 其中的设计是通过动态代理。
存放监听事件接口map。 因为有些接口有多个函数, 代理会判断事件接口是否存在, 如果存在只增加代理方法就够了, 避免重新设置监听事件接口。
代理监听事件
5.注解类2.2 Db模块2.2.1 总体设计流程和关系较少, 请看下面的详细分析
2.2.2 流程图2.2.3 核心类功能介绍注解、反射和数据库操作知识这个模块的主要内容
1.DbUtils.java主要功能数据库的创建,数据库的增删改查。
存放DbUtils实例对象的map,每个数据库对应一个实例, key为数据库的名称。
采取的是单例模式,根据DaoConfig创建数据库, 中间还涉及到数据库升级。
增删改查。
2.DaoConfig.java数据库配置类。
3.FindTempCache.java在DbUtils的查询数据中
数据库查询数据的缓存。在查询中会优先调用缓存中的数据
4.SqlInfoBuilder.javasql建表、增删改语句的组合。
5.SqlInfo.javasql语句和包装对象。
6.Table.java表对象。
7.Column.java表中列对象。
8.Id.java表对应的主键对象。
9.Selector.javasql查询语句的组合。
.WhereBuilder.javasql条件语句的组合。
DBUtils增删改查:
操纵数据库的工具类,无论多牛X,总离不开最根本的CRUD,即创建,查询,更新和删除。下面从这四个角度依次介绍xUtils是如何简便持久化数据的。大家都知道,在Android里面如果要存储一个对象,我们需要创建一个SQLiteOpenHelper,然后还得创建一张对应对象各个属性的表,还得继续把我们的对象转换成ContentValues,进而去存储。真心是麻烦的不能再麻烦了,我们现在介绍的DbUtils就能让你轻松解脱麻绳一样的代码。DbUtils在进行save操作的时候,会根据java反射反射出对象的各个字段,然后去查询数据库中是否存在这个对象类型对应的表,如果表已经存在,直接进行插入操作;如果不存在,就先动态的创建的一张对应我们对象的表,再进行插入处理。直接上代码,大家看。
[java] view plaincopy@OnClick(R.id.insert) public void insert(View v) { Student stu = null; for (int i = 0; i < ; i) { stu = new Student(); stu.setAge( i); stu.setName("jack" i); mList.add(stu); try { dbUtils.save(stu); } catch (DbException e) { e.printStackTrace(); } } } 注意:并不是所有的实体对象都快可以通过这种方式去存储,一定要保证对象的类型中有int类型的id或者_id的属性,这就对应数据库表中的主键字段。如果类型中没有id字段,可以通过@Id注解去指定一个int类型的字段作为主键。如果表中的又字段不想被存储在数据库中,也可以通过@Transient去实现忽略。如果直接存储一个对象的列表,这样也是被允许的,达到批量存储的目的。DbUtils可以帮助对SQL语句不是很熟悉的同学快速的实现查询,而不用去写sql查询语句,而且可以对查询结果进行排序和分页,使用简单,功能强大。大家可以看下,下面的几行代码就能实现复杂的查询功能
[java] view plaincopydbUtils.findAll(Selector.from(Student.class) .where("_id", "<", ).and("age", ">", ).orderBy("_id") .limit(pageSize).offset(pageSize * pageIndex)); 同样的,也可以对数据库中得数据进行便捷的更新。下面演示的是更新Student对应的表中的第一条记录的age这个字段。这个比较简单,就直接上代码看吧。[java] view plaincopy@OnClick(R.id.update) public void update(View v){ try { List<Student> stus = dbUtils.findAll(Selector.from(Student.class)); Student stu = stus.get(0); stu.setAge(); dbUtils.update(stu); } catch (DbException e) { e.printStackTrace(); } } 最后一个就是数据的删除。一个实体对象,一组实体对象,根据条件删除,删除表,删除整个数据库,这些操作都可以通过一句简单的代码来实现,看了代码就明白了。[java] view plaincopy@OnClick(R.id.delete) public void delete(View v){ try { List<Student> stus = dbUtils.findAll(Selector.from(Student.class)); dbUtils.delete(stus.get(0)); dbUtils.deleteAll(stus); dbUtils.deleteById(Student.class, WhereBuilder.b("age", "==", )); dbUtils.dropTable(Student.class); dbUtils.dropDb(); } catch (DbException e) { e.printStackTrace(); } } 2.3 Http模块2.3.1 总体设计2.3.2 流程图2.3.3 类图1.HttpUtils.java支持异步同步访问网络数据, 断点下载文件。
2.HttpRequest.java网络请求的包装类。 包括url, 访问请求方法, 参数等。
3.RequestCallBack.java完成数据请求回调接口。
4.HttpHandler.java获取网络数据逻辑的实现。这里可以理解为系统内部AsyncTask。访问网络数据处理流程图
5.HttpCache.java网络数据的缓存,内部包含LruMemoryCache。在获取数据的时候会判断是否过期。
6.StringDownLoadHandler.javahandleEntity()将网络io流转化为String。
7.FileDownLoadHandler.javahandleEntity()将网络io流转化为File。
8.HttpException.java统一异常
2.4 Bitmap模块2.4.1 总体设计2.4.2 流程图请查看http模块
2.4.3 类图1.BitmapUtils.java图片的异步加载,支持本地和网络图片, 图片的压缩处理, 图片的内存缓存已经本地缓存。
设置图片流程图
详细流程图
2.BitmapLoadTask.java加载图片的异步任务。在doInBackground中读取图片资源
3.BitmapCache.java(1)主要函数4.BitmapGlobalConfig.java配置, 包括线程池, 缓存的大小。
5.BitmapDisplayConfig.java6.DefaultDownloader.java获取bitmap, 支持三种获取路径, 本地文件,资产文件, 和网络图片。
7.DefaultBitmapLoadCallBack.java图片加载完成的的回调, 默认回调将获取的bitmap传递给view。
3. 杂谈和Volley框架相比
相同点:1.采用了网络数据缓存机制。2.通过handler进行线程通信不同点:Volley的Http请求在 android 2.3 版本之前是通过HttpClient ,在之后的版本是通过URLHttpConnection。xUtils都是通过HttpClient请求网络(bitmap模块图片下载是通过URLHttpConnection)。 URLHttpConnection默认支持GZIP压缩,api操作简单。2.Volley将Http请求数据先缓存进byte[], 然后是分配给不同的请求转化为需要的式。xUtils是直接转化为想要的式。 Volley:扩展性好, 但是不能存在大数据请求,否则就OOM。xUtils:不缓存入byte[] 支持大数据的请求, 速度比Volley稍快,但扩展性就低。4.Volley访问网络数据时直接开启固定个数线程访问网络, 在run方法中执行死循环, 阻塞等待请求队列。 xUtils是开启线程池来管理线程。缓存失效策略, volley的所有网络数据支持从http响应头中控制是否缓存和读取缓存失效时间,每个请求可以控制是否缓存和缓存失效时间。 Xutils网络数据请求是统一自定义缓存失效时间。android style中出现自定义属性时的写法 当我们为自定义控件写style的时候,style里面不可避免的会出现自定义属性,那怎么写呢?答案是直接引用属性名stylename=CustomProgressBarSmallThemeitemname=androi
滑动到点击位置的ListView 一个ListView的小Demo,根据点击的位置自动滑动到当前的位置。主界面`publicclassMainActivityextendsActivity{protectedstaticfinalStringTAG=MainActivity;privateListlist=newArrayList(
Android之TextView的Span样式源码剖析 Android中的TextView是个显示文字的的UI类,在现实中的需求中,文字有各式各样的样式,TextView本身没有属性去设置实现,我们可以通过Android提供的Spannable
标签: istio源码解析
本文链接地址:https://www.jiuchutong.com/biancheng/371071.html 转载请保留说明!上一篇:Android Studio 新建项目的R文件丢失的解决方法(android studio 新建项目只有.idea文件)
友情链接: 武汉网站建设