这几天把公司的电商软件第一版完成之后,打算把项目重新优化并排版一下,让软件整体看起来更加美观。作为一名优(lan)雅(duo)的程序猿,一定要时刻保持优雅的情操,比如FindViewById()和SetOnclick等方法,用起来是真心不优雅,打算使用Xutils3的注解功能,之前一直使用的是Xutils,但是Github上面的Xutils已经很久没有更新了,而且Xutils对Android6.0的兼容性不是特别好,于是搜了一下,决定把Xutils和Xutils3的基本知识整理一下方便更多的人学习使用。

一、Xutils简介: Xutils是前几年比较火得一个开源框架,Xutils包含了很多实用的工具类,支持大文件上传,且有更全面的http请求协议支持,拥有灵活的Orm,支持事件注解且不受代码混淆影响。Xutils刚问世的时候真是很多屌丝程序猿的福利啊,集成了这么多功能强大的模块,大家果然都爱不释手,但是随着Android版本的升级和人们开发软件思想的转变,Xutils也暴露出了很多问题,现在用Xutils的已经不是特别的多了,如果想使用的话,推荐使用比较新的Xutils3。

二、Xutils的主要模块:不管是老版本的Xutils还是新版本的Xutils3,总的来说,他们都分了四个重要的模块:ViewUtils,HttpUtils,BitmapUtils,DbUtils。附带的还有一个LogUtils,可以用来输出Log日志,用起来也是蛮方便的。不管是老版本的Xutils还是新版本的Xutils3,总的来说,他们都分了四个重要的模块:ViewUtils,HttpUtils,BitmapUtils,DbUtils。附带的还有一个LogUtils,可以用来输出Log日志,用起来也是蛮方便的。

三、首先要说的是老版本Xutils的4个模块:

  • ViewUtils模块     主要用来代替findViewById()的,也可以用来给控件添加点击事件
[java] view plaincopy
  1. // xUtils的view注解要求必须提供id,以使代码混淆不受影响。
  2. @ViewInject(R.id.textView)
  3. TextView textView;
  4. //@ViewInject(vale=R.id.textView, parentId=R.id.parentView)
  5. //TextView textView;
  6. @ResInject(id = R.string.label, type = ResType.String)
  7. private String label;
  8. // 取消了之前使用方法名绑定事件的方式,使用id绑定不受混淆影响
  9. // 支持绑定多个id @OnClick({R.id.id1, R.id.id2, R.id.id3})
  10. // or @OnClick(value={R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3})
  11. // 更多事件支持参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
  12. @OnClick(R.id.test_button)
  13. public void testButtonClick(View v) { // 方法签名必须和接口中的要求一致
  14. ...
  15. }
  16. ...
  17. //在Activity中注入:
  18. @Override
  19. public void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main);
  22. ViewUtils.inject(this); //注入view和事件
  23. ...
  24. textView.setText("some text...");
  25. ...
  26. }
  27. //在Fragment中注入:
  28. @Override
  29. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  30. View view = inflater.inflate(R.layout.bitmap_fragment, container, false); // 加载fragment布局
  31. ViewUtils.inject(this, view); //注入view和事件
  32. ...
  33. }
  34. //在PreferenceFragment中注入:
  35. public void onActivityCreated(Bundle savedInstanceState) {
  36. super.onActivityCreated(savedInstanceState);
  37. ViewUtils.inject(this, getPreferenceScreen()); //注入view和事件
  38. ...
  39. }
  40. // 其他重载
  41. // inject(View view);
  42. // inject(Activity activity)
  43. // inject(PreferenceActivity preferenceActivity)
  44. // inject(Object handler, View view)
  45. // inject(Object handler, Activity activity)
  46. // inject(Object handler, PreferenceGroup preferenceGroup)
  47. // inject(Object handler, PreferenceActivity preferenceActivity)
  • HttpUtils模块    主要用来进行各种常见网络请求和文件下载以及上传。
[java] view plaincopy
  1. /**普通get方法**/
  2. HttpUtils http = new HttpUtils();
  3. http.send(HttpRequest.HttpMethod.GET,
  4. "http://www.lidroid.com",
  5. new RequestCallBack<String>(){
  6. @Override
  7. public void onLoading(long total, long current, boolean isUploading) {
  8. testTextView.setText(current + "/" + total);
  9. }
  10. @Override
  11. public void onSuccess(ResponseInfo<String> responseInfo) {
  12. textView.setText(responseInfo.result);
  13. }
  14. @Override
  15. public void onStart() {
  16. }
  17. @Override
  18. public void onFailure(HttpException error, String msg) {
  19. }
  20. });
  21. /**使用HttpUtils上传文件 或者 提交数据 到服务器(post方法)**/
  22. RequestParams params = new RequestParams();
  23. params.addHeader("name", "value");
  24. params.addQueryStringParameter("name", "value");
  25. // 只包含字符串参数时默认使用BodyParamsEntity,
  26. // 类似于UrlEncodedFormEntity("application/x-www-form-urlencoded")。
  27. params.addBodyParameter("name", "value");
  28. // 加入文件参数后默认使用MultipartEntity("multipart/form-data"),
  29. // 如需"multipart/related",xUtils中提供的MultipartEntity支持设置subType为"related"。
  30. // 使用params.setBodyEntity(httpEntity)可设置更多类型的HttpEntity(如:
  31. // MultipartEntity,BodyParamsEntity,FileUploadEntity,InputStreamUploadEntity,StringEntity)。
  32. // 例如发送json参数:params.setBodyEntity(new StringEntity(jsonStr,charset));
  33. params.addBodyParameter("file", new File("path"));
  34. HttpUtils http = new HttpUtils();
  35. http.send(HttpRequest.HttpMethod.POST,
  36. "uploadUrl....",
  37. params,
  38. new RequestCallBack<String>() {
  39. @Override
  40. public void onStart() {
  41. testTextView.setText("conn...");
  42. }
  43. @Override
  44. public void onLoading(long total, long current, boolean isUploading) {
  45. if (isUploading) {
  46. testTextView.setText("upload: " + current + "/" + total);
  47. } else {
  48. testTextView.setText("reply: " + current + "/" + total);
  49. }
  50. }
  51. @Override
  52. public void onSuccess(ResponseInfo<String> responseInfo) {
  53. testTextView.setText("reply: " + responseInfo.result);
  54. }
  55. @Override
  56. public void onFailure(HttpException error, String msg) {
  57. testTextView.setText(error.getExceptionCode() + ":" + msg);
  58. }
  59. });
  60. /**使用HttpUtils下载文件:支持断点续传,随时停止下载任务,开始任务**/
  61. HttpUtils http = new HttpUtils();
  62. HttpHandler handler = http.download("http://apache.dataguru.cn/httpcomponents/httpclient/source/httpcomponents-client-4.2.5-src.zip",
  63. "/sdcard/httpcomponents-client-4.2.5-src.zip",
  64. true, // 如果目标文件存在,接着未完成的部分继续下载。服务器不支持RANGE时将从新下载。
  65. true, // 如果从请求返回信息中获取到文件名,下载完成后自动重命名。
  66. new RequestCallBack<File>() {
  67. @Override
  68. public void onStart() {
  69. testTextView.setText("conn...");
  70. }
  71. @Override
  72. public void onLoading(long total, long current, boolean isUploading) {
  73. testTextView.setText(current + "/" + total);
  74. }
  75. @Override
  76. public void onSuccess(ResponseInfo<File> responseInfo) {
  77. testTextView.setText("downloaded:" + responseInfo.result.getPath());
  78. }
  79. @Override
  80. public void onFailure(HttpException error, String msg) {
  81. testTextView.setText(msg);
  82. }
  83. });
  84. //调用cancel()方法停止下载
  85. handler.cancel();
  • BitmapUtils模块    主要用来加载ImageView的图片资源,可以本地图片,也可以是网络图片

[java] view plaincopy
  1. BitmapUtils bitmapUtils = new BitmapUtils(this);
  2. // 加载网络图片
  3. bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");
  4. // 加载本地图片(路径以/开头, 绝对路径)
  5. bitmapUtils.display(testImageView, "/sdcard/test.jpg");
  6. // 加载assets中的图片(路径以assets开头)
  7. bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");
  8. // 使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片
  9. listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
  10. listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));
  • DbUtils模块    主要用来操作数据库的
[java] view plaincopy
  1. DbUtils db = DbUtils.create(this);
  2. User user = new User(); //这里需要注意的是User对象必须有id属性,或者有通过@ID注解的属性
  3. user.setEmail("wyouflf@qq.com");
  4. user.setName("wyouflf");
  5. db.save(user); // 使用saveBindingId保存实体时会为实体的id赋值
  6. // 查找
  7. Parent entity = db.findById(Parent.class, parent.getId());
  8. List<Parent> list = db.findAll(Parent.class);//通过类型查找
  9. Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=","test"));
  10. // IS NULL
  11. Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=", null));
  12. // IS NOT NULL
  13. Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","!=", null));
  14. // WHERE id<54 AND (age>20 OR age<30) ORDER BY id LIMIT pageSize OFFSET pageOffset
  15. List<Parent> list = db.findAll(Selector.from(Parent.class)
  16. .where("id" ,"<", 54)
  17. .and(WhereBuilder.b("age", ">", 20).or("age", " < ", 30))
  18. .orderBy("id")
  19. .limit(pageSize)
  20. .offset(pageSize * pageIndex));
  21. // op为"in"时,最后一个参数必须是数组或Iterable的实现类(例如List等)
  22. Parent test = db.findFirst(Selector.from(Parent.class).where("id", "in", new int[]{1, 2, 3}));
  23. // op为"between"时,最后一个参数必须是数组或Iterable的实现类(例如List等)
  24. Parent test = db.findFirst(Selector.from(Parent.class).where("id", "between", new String[]{"1", "5"}));
  25. DbModel dbModel = db.findDbModelAll(Selector.from(Parent.class).select("name"));//select("name")只取出name列
  26. List<DbModel> dbModels = db.findDbModelAll(Selector.from(Parent.class).groupBy("name").select("name", "count(name)"));
  27. List<DbModel> dbModels = db.findDbModelAll(sql); // 自定义sql查询
  28. db.execNonQuery(sql) // 执行自定义sql

  • LogUtils工具类 打印输出日志
[java] view plaincopy
  1. // 自动添加TAG,格式: className.methodName(L:lineNumber)
  2. // 可设置全局的LogUtils.allowD = false,LogUtils.allowI = false...,控制是否输出log。
  3. // 自定义log输出LogUtils.customLogger = new xxxLogger();
  4. LogUtils.d("打印测试");
ok,关于Xutils的使用就简单地介绍这么多,ViewUtils,HttpUtils,BitmapUtils,DbUtils这4个模块的使用其实还是有一定规律的,除了DbUtils使用create创建对象外,其余的3个模块都是使用new来创建对象的。

四、接下来再说一下Xutils3的4个模块:

  • xUtils3变化较多所以建立了新的项目不在旧版(github.com/wyouflf/xUtils)上继续维护, 相对于旧版本:

    1. HTTP实现替换HttpClient为UrlConnection, 自动解析回调泛型, 更安全的断点续传策略.
    2. 支持标准的Cookie策略, 区分domain, path...
    3. 事件注解去除不常用的功能, 提高性能.
    4. 数据库api简化提高性能, 达到和greenDao一致的性能.
    5. 图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转..

以上是官方的说明,下面来看具体使用。

Xutils3的使用方式和Xutils有很大的改变,所以请新建一个工程,按照下面的步骤操作:

  • 首先新建一个Application类,在里面对Xutils3做初始化工作:
[java] view plaincopy
  1. // 在application的onCreate中初始化
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. x.Ext.init(this);
  6. x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
  7. }

xutils3和Xutils使用方式有一些区别,以前是使用new得到各模块的对象,现在使用:x.模块名()得到对象,回调接口也使用统一的一个,回调接口支持泛型。

  • ViewUtils的使用基本没有变,只是绑定点击事件的时候有些出入:
[java] view plaincopy
  1. //使用ViewUtils绑定控件
  2. @ViewInject(R.id.txtv)
  3. private TextView txtv;
  4. @ViewInject(R.id.imgv)
  5. private ImageView imgv;

绑定事件:

[java] view plaincopy
  1. /**
  2. * 使用ViewUtils设置按钮的点击事件,方法必须要私有化, 参数格式和type的参数一致,为了混淆方便,方法名要以Event或者Click结尾
  3. * type可以不写,默认是点击事件类型
  4. */
  5. @Event(value = R.id.btn, type = View.OnClickListener.class)
  6. private void btnClick(View view) {}
  • HttpUtlis的使用:
[java] view plaincopy
  1. // 请求参数
  2. RequestParams params = new RequestParams("http://www.baidu.com");
  3. x.http().get(params, new CommonCallback<String>() {
  4. @Override
  5. public void onCancelled(CancelledException arg0) {
  6. }
  7. @Override
  8. public void onError(Throwable arg0, boolean arg1) {
  9. }
  10. @Override
  11. public void onFinished() {
  12. }
  13. @Override
  14. public void onSuccess(String arg0) {
  15. // 成功下载,显示到txtv上面
  16. txtv.setText(arg0);
  17. }
  18. });
  • BitmapUtils的使用:
[java] view plaincopy
  1. // 设置加载图片的参数
  2. ImageOptions options = new ImageOptions.Builder()
  3. // 是否忽略GIF格式的图片
  4. .setIgnoreGif(false)
  5. // 图片缩放模式
  6. .setImageScaleType(ScaleType.CENTER_CROP)
  7. // 下载中显示的图片
  8. .setLoadingDrawableId(R.drawable.ic_launcher)
  9. // 下载失败显示的图片
  10. .setFailureDrawableId(R.drawable.ic_launcher)
  11. // 得到ImageOptions对象
  12. .build();
  13. // 加载图片
  14. x.image().bind(imgv, imagUrl, options, new CommonCallback<Drawable>() {
  15. @Override
  16. public void onSuccess(Drawable arg0) {
  17. LogUtil.e("下载成功");
  18. }
  19. @Override
  20. public void onFinished() {
  21. LogUtil.e("下载完成");
  22. }
  23. @Override
  24. public void onError(Throwable arg0, boolean arg1) {
  25. LogUtil.e("下载出错," + arg0.getMessage());
  26. }
  27. @Override
  28. public void onCancelled(CancelledException arg0) {
  29. LogUtil.e("下载取消");
  30. }
  31. });
  32. // 加载本地图片
  33. // x.image().bind(imgv, "assets://test.gif", options);
  34. // x.image().bind(iv_big_img, new
  35. // File("/sdcard/test.gif").toURI().toString(), imageOptions);
  36. // x.image().bind(iv_big_img, "/sdcard/test.gif", imageOptions);
  37. // x.image().bind(iv_big_img, "file:///sdcard/test.gif", imageOptions);
  38. // x.image().bind(iv_big_img, "file:/sdcard/test.gif", imageOptions);
  • DbUtils的使用:

先建一个类,用来生成数据库中的表,这里新建一个StudentInfo类(注意里面的@标签的使用,使用这些标签生成表的结构信息)内容如下:

[java] view plaincopy
  1. @Table(name = "info")
  2. public class StudentInfo {
  3. @Column(name = "id", isId = true)
  4. private int id;
  5. @Column(name = "name")
  6. private String name;
  7. @Column(name = "age")
  8. private int age;
  9. public int getId() {
  10. return id;
  11. }
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public int getAge() {
  22. return age;
  23. }
  24. public void setAge(int age) {
  25. this.age = age;
  26. }
  27. }

然后:

[java] view plaincopy
  1. DbManager.DaoConfig daoConfig = new DaoConfig()
  2. // 数据库的名字
  3. .setDbName("SudentInfo")
  4. // 保存到指定路径
  5. // .setDbDir(new
  6. // File(Environment.getExternalStorageDirectory().getAbsolutePath()))
  7. // 数据库的版本号
  8. .setDbVersion(1)
  9. // 数据库版本更新监听
  10. .setDbUpgradeListener(new DbUpgradeListener() {
  11. @Override
  12. public void onUpgrade(DbManager arg0, int arg1, int arg2) {
  13. LogUtil.e("数据库版本更新了!");
  14. }
  15. });
  16. DbManager manager = x.getDb(daoConfig);
  17. try {
  18. //创建对象,用来生成表
  19. StudentInfo info = new StudentInfo();
  20. info.setAge(16);
  21. info.setName("小花");
  22. //创建表
  23. manager.saveOrUpdate(info);
  24. } catch (DbException e) {
  25. e.printStackTrace();
  26. }

最后附带上Xutils和Xutils3的Github项目地址:

xUtil的源码项目下载地址:点击打开链接

xUtils3的源码项目下载地址:点击打开链接

Android Xutils和Xutils3的基本使用相关推荐

  1. Android xUtils框架解析

    xUtils简介 xUtils是基于Afinal开发的目前功能比较完善的一个Android开源框架,最近又发布了xUtil3.0,在增加新功能的同时又提高了框架的性能,下面来看看官方(https:// ...

  2. android xutils json请求,Android Xutils3网络请求的封装详解及实例代码

    Xutils3网络请求的封装详解 封装了一个Xutil3的网络请求工具类,分享给大家,本人水平有限,不足之处欢迎指出. 使用前先配置xutils3: 1.gradle中添加 compile 'org. ...

  3. android xutils数据库操作,XUtils3.0之本地数据库操作

    5](http://mvnrepository.com/)找到对应的版本 compile 'org.xutils:xutils:3.0' -->build project Paste_Image ...

  4. android xutils 上传图片,Android使用xUtils3上传图片报错解决:java.lang.ArrayIndexOutOfBoundsException: 70918...

    [windows驱动]基本概念 https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff554721 1.设备节点和设备堆栈 在wind ...

  5. android studio3 使用xutils3

    一,GitHub:https://github.com/wyouflf/xUtils3/tree/master(或者https://github.com/wyouflf/xUtils3)并且解压,解压 ...

  6. android xUtils的使用

    gethub地址:https://github.com/wyouflf/xUtils/ xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的ht ...

  7. android xUtils 2.6.14 jar 下载 使用 和混淆

    一.ViewUtils 你受够了重复冗长的findViewById了嘛?你受够了各种监听事件的绑定了嘛?在这里,你只需要一句注解,如@ViewInject.@OnClick,就能轻松摆脱小白似的代码, ...

  8. android xutils框架缓存图片,xUtils框架的使用

    xUtils简介 xUtils 包含了很多实用的android工具,xUtils 源于Afinal框架,对Afinal进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持,拥有 ...

  9. android xutils 教程,Android AS为xutils添加依赖过程图解

    在使用xutils时遇到不能添加以来的问题,花了很长时间终于解决,网上添加依赖的方法很多,在此针对个人出现的问题作下笔记. 我本想使用jar包,因为在使用smartImageView时是用的jar包来 ...

最新文章

  1. [ Linux ] [ OS ] [ memory ] Linux 如何查看系統硬體的記憶體(RAM)資訊
  2. Static Final用法
  3. 菜鸟要飞java_Java Android视频教程 下载
  4. scn exercise view.setModel will trigger binding creation in Fiori
  5. java 反射机制性能_Java反射机制的用途和缺点
  6. 深度学习之边框回归(Bounding Box Regression)
  7. pandas 读表格_pandas电子表格的读取(pandas中的read_excel)
  8. python如何全网爬取_如何通过Python爬取互联网
  9. 巧用HashSet装载非重数据(洛谷P2250题题解,Java语言描述)
  10. 微服务升级_SpringCloud Alibaba工作笔记0002---理解反应式编程中的背压(Backpressure)机_流的逆向压力
  11. sersync+rsync 数据同步配置
  12. zabbix 添加 host item
  13. 遥感数据集_最新高光谱遥感数据集
  14. Linux下Gogs二进制安装配置
  15. 动环监控整体方案,动环监控系统施工方案
  16. 浅析ISO三体系标准认证对企业的作用
  17. 做一个有意境的女人难上加难
  18. 台式计算机启用时间查看,win7系统如何查看电脑的开关机时间想知道是否有他人使用...
  19. Linux内核数据结构之 radix tree
  20. 物理定律告诉你:表白可能巨亏,分手一定血赚

热门文章

  1. 浅谈PPTC自恢复保险丝阻值规律
  2. 周受资离开小米,将加入字节跳动担任 CFO
  3. Xcode10.0升级笔记
  4. 机器学习 - 主成分分析法 (PCA)
  5. 用C++解线性规划问题
  6. Python全栈(八)Flask项目实战之10.前台发布帖子和后台帖子管理页面搭建
  7. 通过swagger2markup来实现swagger2 Word/PDF/HTML的导出
  8. 网站分析里,基本术语解析
  9. linux gcc反汇编,objdump(Linux)反汇编命令使用指南
  10. 色彩理论系列之一认识颜色