文章目录
xUtils3入门使用及部分解析
xUtils简介
xUitls是一个第三方库,其就是一个工具类,是最初源于Afinal框架,进行了大量的重构,使得其能够支持大文件上传,以及更安全的Http请求协议支持。
它主要分为4个模块:DbUtils、HttpUtils、ViewUtils、BitmapUtils
DbUtils:
- android中的orm框架,一行代码就可以进行增删改查;
- 支持事务,默认关闭;
- 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);
- 支持绑定外键,保存实体时外键关联实体自动保存或更新;
- 自动加载外键关联实体,支持延时加载;
- 支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。
ViewUtils:
- android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
- 新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
- 目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
HttpUtils:
- 支持同步,异步方式的请求;
- 支持大文件上传,上传大文件不会oom;
- 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求;
- 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
- 返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。
BitmapUtils:
- 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
- 支持加载网络图片和本地图片;
- 内存管理使用lru算法,更好的管理bitmap内存;
- 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等…
由于xUtils已经很久不更新了,目前我们就使用它的升级版,也就是xUtils3
这是它的官方网站
xUtils3相对于旧版有了一些变化:
-
HTTP实现替换HttpClient为UrlConnection, 自动解析回调泛型, 更安全的断点续传策略;
-
支持标准的Cookie策略, 区分domain, path;
-
事件注解去除不常用的功能, 提高性能;
-
数据库api简化提高性能, 达到和greenDao一致的性能;
-
图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转。
实操部分:
搭建初始化环境
1.Gradle构建时添加以下依赖:
implementation 'org.xutils:xutils:3.8.9'
2.加入所需要的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 可选 -->
3.进行初始化(记得是在application中进行初始化,这点与旧版不一致)
// 在application的onCreate中初始化
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
...
}
4.在配置文件中进行引用:
5.在MainActivity也要进行声明
添加如下代码:
x.view().inject(this);
到此为止,xUitls3的初始化已经完成,接下来可以进行功能的使用了。
ViewUtils模块的使用
ViewUtils的使用无需findViewById和setClickListener等,它用注解进行了替代,大大简化了我们的开发。这里简单介绍几个常用注解
@ContentView()
这是个什么注解呢?
很明显,通过名字我们便可得知,它就是用来替代**setContentView()**的
它怎么使用呢?
我们点开它的源代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentView {
int value();
}
可以看到,在这个注解中,只需要Value填入你的布局文件id即可。然后将其标注在你的Activity上即可
@ViewInject()
这是个什么注解呢?
通过直译这个注解可以很明显的知道,它就是用来注入view的,也就是说,它替代了我们的findViewById()
它怎么使用呢?
源代码:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
int value();
/* parent view id */
int parentId() default 0;
}
可以看到,它也只需要注入value即可,并标注在TextView上即可。
例:
@ViewInject(R.id.queryname)
TextView tv;
@Event()
这个注解主要用于事件的处理。
源代码:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Event {
/**
* 控件的id集合, id小于1时不执行ui事件绑定.
*/
int[] value();
/**
* 控件的parent控件的id集合, 组合为(value[i], parentId[i] or 0).
*/
int[] parentId() default 0;
/**
* 事件的listener, 默认为点击事件.
*/
Class<?> type() default View.OnClickListener.class;
/**
* 事件的setter方法名, 默认为set+type#simpleName.
*/
String setter() default "";
/**
* 如果type的接口类型提供多个方法, 需要使用此参数指定方法名.
*/
String method() default "";
}
这里有几点注意点:
- 注解的方法必须用private进行修饰
- 对于返回值类型没有要求
- 参数名和type的接口要求的参数名要一致
- 多个value值用{}括起来
举一个小例子:
@Event(value = {
R.id.btn1,R.id.btn2,R.id.btn3})
private void onClick(View v) {
switch (v.getId()){
case R.id.btn1 :
Toast.makeText(getApplicationContext(),"btn1被点击了",Toast.LENGTH_LONG).show();
case R.id.btn2 :
Toast.makeText(getApplicationContext(),"btn2被点击了",Toast.LENGTH_LONG).show();
case R.id.btn3 :
Toast.makeText(getApplicationContext(),"btn3被点击了",Toast.LENGTH_LONG).show();
}
}
DbUtils模块的使用
首先,我们在MainActivity中new一个DbManager.DaoConfig
这个DaoConfig都有什么东西呢?这里我总结一下: