转载自:http://www.apkbus.com/forum.php?mod=viewthread&tid=241060&highlight=xUtils
最近搜了一些框架供初学者学习,比较了一下XUtils是目前git上比较活跃 功能比较完善的一个框架,是基于afinal开发的,比afinal稳定性提高了不少,下面是介绍: xUtils简介
  • xUtils 包含了很多实用的android工具。
  • xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...一般来讲,Android开发,基本混淆是可以的,但除了混淆之外,还需要借助一些资源平台给原本混淆过的代码增加一层安全性,即加密保护http://t.cn/Rz0bhUA,这是如今做Android开发不得不学不懂不知的一项技能!
  • xUitls最低兼容android 2.2 (api level 8)
  • 目前xUtils主要有四大模块:
    • 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快速开发框架需要有以下权限:

  • [Python] 查看源文件 复制代码
    <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 混淆时注意事项:
    • 添加Android默认混淆配置${sdk.dir}/tools/proguard/proguard-android.txt
    • 不要混淆xUtils中的注解类型,添加混淆配置:-keep class * extends java.lang.annotation.Annotation { *; }
    • 对使用DbUtils模块持久化的实体类不要混淆,或者注解所有表和列名称@Table(name="xxx"),@Id(column="xxx"),@Column(column="xxx"),@Foreign(column="xxx",foreign="xxx");

    DbUtils使用方法:

  • [Python] 查看源文件 复制代码
    DbUtils db = DbUtils.create(this);User user = new User(); //这里需要注意的是User对象必须有id属性,或者有通过@ID注解的属性user.setEmail("wyouflf@qq.com");user.setName("wyouflf");db.save(user); // 使用saveBindingId保存实体时会为实体的id赋值...// 查找Parent entity = db.findById(Parent.class, parent.getId());List<Parent> list = db.findAll(Parent.class);//通过类型查找Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=","test"));// IS NULLParent Parent = db.findFirst(Selector.from(Parent.class).where("name","=", null));// IS NOT NULLParent Parent = db.findFirst(Selector.from(Parent.class).where("name","!=", null));// WHERE id<54 AND (age>20 OR age<30) ORDER BY id LIMIT pageSize OFFSET pageOffsetList<Parent> list = db.findAll(Selector.from(Parent.class)                                   .where("id" ,"<", 54)                                   .and(WhereBuilder.b("age", ">", 20).or("age", " < ", 30))                                   .orderBy("id")                                   .limit(pageSize)                                   .offset(pageSize * pageIndex));// op为"in"时,最后一个参数必须是数组或Iterable的实现类(例如List等)Parent test = db.findFirst(Selector.from(Parent.class).where("id", "in", new int[]{1, 2, 3}));// op为"between"时,最后一个参数必须是数组或Iterable的实现类(例如List等)Parent test = db.findFirst(Selector.from(Parent.class).where("id", "between", new String[]{"1", "5"}));DbModel dbModel = db.findDbModelAll(Selector.from(Parent.class).select("name"));//select("name")只取出name列List<DbModel> dbModels = db.findDbModelAll(Selector.from(Parent.class).groupBy("name").select("name", "count(name)"));...List<DbModel> dbModels = db.findDbModelAll(sql); // 自定义sql查询db.execNonQuery(sql) // 执行自定义sql...
  • ViewUtils使用方法
    • 完全注解方式就可以进行UI绑定和事件绑定。
    • 无需findViewById和setClickListener等。
    • [Python] 查看源文件 复制代码
      // xUtils的view注解要求必须提供id,以使代码混淆不受影响。@ViewInject(R.id.textView)TextView textView;//@ViewInject(vale=R.id.textView, parentId=R.id.parentView)//TextView textView;@ResInject(id = R.string.label, type = ResType.String)private String label;// 取消了之前使用方法名绑定事件的方式,使用id绑定不受混淆影响// 支持绑定多个id @OnClick({R.id.id1, R.id.id2, R.id.id3})// or @OnClick(value={R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3})// 更多事件支持参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。@OnClick(R.id.test_button)public void testButtonClick(View v) { // 方法签名必须和接口中的要求一致    ...}...//在Activity中注入:@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    ViewUtils.inject(this); //注入view和事件    ...    textView.setText("some text...");    ...}//在Fragment中注入:@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {    View view = inflater.inflate(R.layout.bitmap_fragment, container, false); // 加载fragment布局    ViewUtils.inject(this, view); //注入view和事件    ...}//在PreferenceFragment中注入:public void onActivityCreated(Bundle savedInstanceState) {    super.onActivityCreated(savedInstanceState);    ViewUtils.inject(this, getPreferenceScreen()); //注入view和事件    ...}// 其他重载// inject(View view);// inject(Activity activity)// inject(PreferenceActivity preferenceActivity)// inject(Object handler, View view)// inject(Object handler, Activity activity)// inject(Object handler, PreferenceGroup preferenceGroup)// inject(Object handler, PreferenceActivity preferenceActivity)
  • HttpUtils使用方法: 普通get方法
  • [Python] 查看源文件 复制代码
    HttpUtils http = new HttpUtils();http.send(HttpRequest.HttpMethod.GET,    "http://www.lidroid.com",    new RequestCallBack<String>(){        @Override        public void onLoading(long total, long current, boolean isUploading) {            testTextView.setText(current + "/" + total);        }        @Override        public void onSuccess(ResponseInfo<String> responseInfo) {            textView.setText(responseInfo.result);        }        @Override        public void onStart() {        }        @Override        public void onFailure(HttpException error, String msg) {        }});
  • 使用HttpUtils上传文件 或者 提交数据 到服务器(post方法)
  • [Python] 查看源文件 复制代码
    RequestParams params = new RequestParams();params.addHeader("name", "value");params.addQueryStringParameter("name", "value");// 只包含字符串参数时默认使用BodyParamsEntity,// 类似于UrlEncodedFormEntity("application/x-www-form-urlencoded")。params.addBodyParameter("name", "value");// 加入文件参数后默认使用MultipartEntity("multipart/form-data"),// 如需"multipart/related",xUtils中提供的MultipartEntity支持设置subType为"related"。// 使用params.setBodyEntity(httpEntity)可设置更多类型的HttpEntity(如:// MultipartEntity,BodyParamsEntity,FileUploadEntity,InputStreamUploadEntity,StringEntity)。// 例如发送json参数:params.setBodyEntity(new StringEntity(jsonStr,charset));params.addBodyParameter("file", new File("path"));...HttpUtils http = new HttpUtils();http.send(HttpRequest.HttpMethod.POST,    "uploadUrl....",    params,    new RequestCallBack<String>() {        @Override        public void onStart() {            testTextView.setText("conn...");        }        @Override        public void onLoading(long total, long current, boolean isUploading) {            if (isUploading) {                testTextView.setText("upload: " + current + "/" + total);            } else {                testTextView.setText("reply: " + current + "/" + total);            }        }        @Override        public void onSuccess(ResponseInfo<String> responseInfo) {            testTextView.setText("reply: " + responseInfo.result);        }        @Override        public void onFailure(HttpException error, String msg) {            testTextView.setText(error.getExceptionCode() + ":" + msg);        }});
  • 使用HttpUtils下载文件:
    • 支持断点续传,随时停止下载任务,开始任务
    • [Python] 查看源文件 复制代码
      HttpUtils http = new HttpUtils();HttpHandler handler = http.download("http://apache.dataguru.cn/httpcomponents/httpclient/source/httpcomponents-client-4.2.5-src.zip",    "/sdcard/httpcomponents-client-4.2.5-src.zip",    true, // 如果目标文件存在,接着未完成的部分继续下载。服务器不支持RANGE时将从新下载。    true, // 如果从请求返回信息中获取到文件名,下载完成后自动重命名。    new RequestCallBack<File>() {        @Override        public void onStart() {            testTextView.setText("conn...");        }        @Override        public void onLoading(long total, long current, boolean isUploading) {            testTextView.setText(current + "/" + total);        }        @Override        public void onSuccess(ResponseInfo<File> responseInfo) {            testTextView.setText("downloaded:" + responseInfo.result.getPath());        }        @Override        public void onFailure(HttpException error, String msg) {            testTextView.setText(msg);        }});...//调用cancel()方法停止下载handler.cancel();
  • BitmapUtils 使用方法
  • [Python] 查看源文件 复制代码
    BitmapUtils bitmapUtils = new BitmapUtils(this);// 加载网络图片bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");// 加载本地图片(路径以/开头, 绝对路径)bitmapUtils.display(testImageView, "/sdcard/test.jpg");// 加载assets中的图片(路径以assets开头)bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");// 使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));
  • 输出日志 LogUtils
  • [Python] 查看源文件 复制代码
    // 自动添加TAG,格式: className.methodName(L:lineNumber)// 可设置全局的LogUtils.allowD = false,LogUtils.allowI = false...,控制是否输出log。// 自定义log输出LogUtils.customLogger = new xxxLogger();LogUtils.d("wyouflf");v

Android 快速开发框架XUtils的更多相关文章

  1. Android快速开发框架汇总

    知乎贴:Android 开发有什么好的架构么? 里面这篇不错:Architecting Android…The clean way? 知乎贴: 一.如果对App的性能.包size有要求,对代码有洁癖不 ...

  2. AndroidAnnotations(Code Diet)android快速开发框架

    最近用了一款很不错的android快速开发框架,1000行的代码瞬间变成几百行,不用你会后悔的 特点: (1) 依赖注入:包括view,extras,系统服务,资源等等(2) 简单的线程模型,通过an ...

  3. [原] Android快速开发框架-AndroidFine,GitHub开源

    Android快速开发框架 UI组件,不止是简单整合,更易用 沉浸式状态栏,界面更漂亮 左滑返回,非常流畅 简单.可复用.易扩展的底部导航 PagerSlidingTabStrip,导航标签文字颜色和 ...

  4. Android快速开发框架ZBLibrary源码分享

    坐标标准库ZBLibrary,是一个MVP架构的Android快速开发框架,提供一套开发标准(UI,Data,Listener)以及模板和工具类并规范代码. 封装层级少,简单高效兼容性好.Androi ...

  5. Android 最火的快速开发框架XUtils

    参考:http://www.oschina.net/p/xutils 项目git地址https://github.com/wyouflf/xUtils 目录(?)[-] 最近搜了一些框架供初学者学习比 ...

  6. 【转】Android 最火的快速开发框架XUtils

    原文:http://blog.csdn.net/rain_butterfly/article/details/37812371 最近搜了一些框架供初学者学习,比较了一下XUtils是目前git上比较活 ...

  7. Android 快速开发框架:推荐10个框架:afinal、ThinkAndroid、andBase、KJFrameForAndroid、SmartAndroid、dhroid..

    对于Android初学者以及对于我们菜鸟,这些大神们开发的轻量级框架非常有用(更别说开源的了). 下面转载这10个框架的介绍:(按顺序来吧没有什么排名). 一.  Afinal 官方介绍: Afina ...

  8. 使用android快速开发框架afinal的FinalDb操作android数据库

    http://my.oschina.net/yangfuhai/blog/87459 今天给大家介绍下#afinal#来操作android的数据库sqlite. #afinal#是一个android的 ...

  9. android 快速开发框架

    https://github.com/lipanquan/LPQRapidDevelopmentFramework 依赖LPQLibrary https://github.com/lipanquan/ ...

随机推荐

  1. 基于 Eclipse 平台的代码生成技术

    ------------------------------------------------------------------ 转自http://www.ibm.com/developerwor ...

  2. hdu 4869

    一个机智题,可惜比赛的时候没有机智出来 #include<cstdio> #include<cstring> #include<cmath> #include< ...

  3. 果盟广告SDK

    // // GuomobWallView.h // GuoMobWallSample // // Created by keyrun on 14-1-21. // Copyright (c) 2014 ...

  4. How does database indexing work?

    When data is stored on disk based storage devices, it is stored as blocks of data. These blocks are ...

  5. POJ 3104

    Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7959   Accepted: 2014 Descriptio ...

  6. java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream

    管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把 ...

  7. mac 下周期调度命令或脚本

    crontab 是在linux服务器上部署定时任务的方法 0 5 * * * /usr/bin/python /data/www/tools/mysql_backup.py cmd之前有5个项目要填, ...

  8. Linux文件系统介绍

    1.ext2/ext3(日志功能)文件系统(Linux标准文件系统.一种索引式文件系统) SuperBlock:Superblock是记录整个filesystem 相关信息的地方,没有Superblo ...

  9. Java学习笔记之:Java的变量

    一.介绍 在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: type identifier [ = value][, identifier [= value] ...] ; 格式 ...

  10. JavaWeb项目开发案例精粹-第3章在线考试系统-005action层

    1. <?xml version="1.0" encoding="UTF-8" ?><!-- XML声明 --> <!DOCTYP ...