Android Xutils和Xutils3的基本使用

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

  • BitmapUtils模块    主要用来加载ImageView的图片资源,可以本地图片,也可以是网络图片

[java]  view plain  copy
  1. BitmapUtils bitmapUtils = new BitmapUtils(this);  
  2.   
  3.   
  4. // 加载网络图片  
  5. bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");  
  6.   
  7.   
  8. // 加载本地图片(路径以/开头, 绝对路径)  
  9. bitmapUtils.display(testImageView, "/sdcard/test.jpg");  
  10.   
  11.   
  12. // 加载assets中的图片(路径以assets开头)  
  13. bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");  
  14.   
  15.   
  16. // 使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片  
  17. listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, falsetrue));  
  18. listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, falsetrue, customListener));  

  • DbUtils模块    主要用来操作数据库的
[java]  view plain  copy
  1.  DbUtils db = DbUtils.create(this);  
  2. User user = new User(); //这里需要注意的是User对象必须有id属性,或者有通过@ID注解的属性  
  3. user.setEmail("[email protected]");  
  4. user.setName("wyouflf");  
  5. db.save(user); // 使用saveBindingId保存实体时会为实体的id赋值  
  6.   
  7. // 查找  
  8. Parent entity = db.findById(Parent.class, parent.getId());  
  9. List list = db.findAll(Parent.class);//通过类型查找  
  10.   
  11. Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=","test"));  
  12.   
  13. // IS NULL  
  14. Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","="null));  
  15. // IS NOT NULL  
  16. Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","!="null));  
  17.   
  18. // WHERE id<54 AND (age>20 OR age<30) ORDER BY id LIMIT pageSize OFFSET pageOffset  
  19. List list = db.findAll(Selector.from(Parent.class)  
  20.                                    .where("id" ,"<"54)  
  21.                                    .and(WhereBuilder.b("age"">"20).or("age"" < "30))  
  22.                                    .orderBy("id")  
  23.                                    .limit(pageSize)  
  24.                                    .offset(pageSize * pageIndex));  
  25.   
  26. // op为"in"时,最后一个参数必须是数组或Iterable的实现类(例如List等)  
  27. Parent test = db.findFirst(Selector.from(Parent.class).where("id""in"new int[]{123}));                                                            
  28. // op为"between"时,最后一个参数必须是数组或Iterable的实现类(例如List等)  
  29. Parent test = db.findFirst(Selector.from(Parent.class).where("id""between"new String[]{"1""5"}));  
  30.   
  31. DbModel dbModel = db.findDbModelAll(Selector.from(Parent.class).select("name"));//select("name")只取出name列  
  32. List dbModels = db.findDbModelAll(Selector.from(Parent.class).groupBy("name").select("name""count(name)"));  
  33.   
  34. List dbModels = db.findDbModelAll(sql); // 自定义sql查询  
  35. db.execNonQuery(sql) // 执行自定义sql  

  • LogUtils工具类 打印输出日志 
[java]  view plain  copy
  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 plain  copy
  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 plain  copy
  1.  //使用ViewUtils绑定控件  
  2. @ViewInject(R.id.txtv)  
  3. private TextView txtv;  
  4. @ViewInject(R.id.imgv)  
  5. private ImageView imgv;  

绑定事件:

[java]  view plain  copy
  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 plain  copy
  1. // 请求参数  
  2. RequestParams params = new RequestParams("http://www.baidu.com");  
  3. x.http().get(params, new CommonCallback() {  
  4.   
  5.     @Override  
  6.     public void onCancelled(CancelledException arg0) {  
  7.   
  8.     }  
  9.   
  10.     @Override  
  11.     public void onError(Throwable arg0, boolean arg1) {  
  12.   
  13.     }  
  14.   
  15.     @Override  
  16.     public void onFinished() {  
  17.   
  18.     }  
  19.   
  20.     @Override  
  21.     public void onSuccess(String arg0) {  
  22.         // 成功下载,显示到txtv上面  
  23.         txtv.setText(arg0);  
  24.     }  
  25. });  
  • BitmapUtils的使用:
[java]  view plain  copy
  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() {  
  15.     @Override  
  16.     public void onSuccess(Drawable arg0) {  
  17.         LogUtil.e("下载成功");  
  18.     }  
  19.   
  20.     @Override  
  21.     public void onFinished() {  
  22.         LogUtil.e("下载完成");  
  23.     }  
  24.   
  25.     @Override  
  26.     public void onError(Throwable arg0, boolean arg1) {  
  27.   
  28.         LogUtil.e("下载出错," + arg0.getMessage());  
  29.     }  
  30.   
  31.     @Override  
  32.     public void onCancelled(CancelledException arg0) {  
  33.         LogUtil.e("下载取消");  
  34.     }  
  35. });  
  36. // 加载本地图片  
  37. // x.image().bind(imgv, "assets://test.gif", options);  
  38. // x.image().bind(iv_big_img, new  
  39. // File("/sdcard/test.gif").toURI().toString(), imageOptions);  
  40. // x.image().bind(iv_big_img, "/sdcard/test.gif", imageOptions);  
  41. // x.image().bind(iv_big_img, "file:///sdcard/test.gif", imageOptions);  
  42. // x.image().bind(iv_big_img, "file:/sdcard/test.gif", imageOptions);  
  • DbUtils的使用:

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

[java]  view plain  copy
  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.   
  10.     public int getId() {  
  11.         return id;  
  12.     }  
  13.   
  14.     public void setId(int id) {  
  15.         this.id = id;  
  16.     }  
  17.   
  18.     public String getName() {  
  19.         return name;  
  20.     }  
  21.   
  22.     public void setName(String name) {  
  23.         this.name = name;  
  24.     }  
  25.   
  26.     public int getAge() {  
  27.         return age;  
  28.     }  
  29.   
  30.     public void setAge(int age) {  
  31.         this.age = age;  
  32.     }  
  33.   
  34. }  

然后:

[java]  view plain  copy
  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)