您的位置:首页 > 移动开发 > Android开发

xUtils框架

2016-09-01 16:43 381 查看
一、什么是xUtils?
        xUtils 是一个工具类的集合体,其中包含许多实用的Android工具,主要包含四大模块:

1、ViewUtils的模块

2、HttpUtils的模块

3、BitmapUtils的模块

4、DBUtils的模块

        xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持,拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响。

        xUitls最低兼容Android 2.2 (API 8)。下载地址:https://github.com/wyouflf/xUtils,目前的版本是2.6.14。将xUtils-*.jar复制到项目的libs下即可。

二、、ViewUtils模块:
(一)、简介:
1、Android中的ioc框架,完全注解方式就可以进行UI、资源和事件绑定;
2、新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
3、目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
【备注:】
        控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则,用来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。
         控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。
        IoC中最基本的Java技术就是“反射”编程。通俗的说反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让对象在生成时才决定要生成哪一种对象。反射的应用是很广泛的,象Hibernate、Spring中都是用“反射”做为最基本的技术手段。
        在过去,反射编程方式相对于正常的对象生成方式要慢10几倍,这也许也是当时为什么反射技术没有普遍应用开来的原因。但经SUN改良优化后,反射方式生成对象和通常对象生成方式,速度已经相差不大了(但依然有一倍以上的差距)。

(二)、ViewUtils的使用:
        完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。

1、View控件注解:
// xUtils的view注解要求必须提供id,以使代码混淆不受影响。
@ViewInject(R.id.textView)
TextView textView;

//@ViewInject(vale=R.id.textView, parentId=R.id.parentView)
//TextView textView;

2、字符串资源注解:

@ResInject(id = R.string.label, type = ResType.String)
private String label;

3、View控件的OnClick回调方法的注解:
// 取消了之前使用方法名绑定事件的方式,使用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) { // 方法签名必须和接口中的要求一致
    ...
}

4、在Activity中注入:
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ViewUtils.inject(this); //注入view和事件
}

5、在Fragment中注入:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.bitmap_fragment, container, false); // 加载fragment布局
    ViewUtils.inject(this, view);
//注入view和事件
}

6、在PreferenceFragment中注入:
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ViewUtils.inject(this, getPreferenceScreen());
//注入view和事件
}

7、其他重载
// 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模块:
(一)、简介:

1、支持同步,异步方式的请求;
2、支持大文件上传,上传大文件不会OOM;
3、支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求;
4、下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
5、返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。

(二)、HttpUtils使用:
1、普通GET方法:
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) {

        }

});
【回调方法说明:】
1)、onStart() 开始执行之前的回调方法
2)、onSuccess(ResponseInfo<T> responseInfo) 请求成功的回调方法
3)、onFailure(HttpException error, String msg) 请求失败的回调方法
4)、onLoading(long total, long current, boolean isUploading) 正在执行的回调方法
5)、onCancelled()  取消请求的回调方法

2、使用HttpUtils上传文件 或者 提交数据 到服务器(post方法)
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);

        }

});

【文件上传的send()方法参数说明:】

第一个参数:请求方法,在此使用HttpMethod.POST
第二个参数:上传请求的网络路径
第三个参数:上传的数据,包含基本信息和上传文件信息
第四个参数:请求的回调接口

3、使用HttpUtils下载文件:【支持断点续传,随时停止下载任务,开始任务】
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();

...

【文件下载download()方法参数说明:】
第一个参数url:网络资源地址
第二个参数target: 本地存储位置,如/mnt/sdcard/aa.mp3
第三个参数autoResume:是否继续下载(断点续传)
第四个参数autoRename:从请求返回信息中获取文件名,下载完成后是否重命名
第五个参数:异步请求的回调接口

四、BitmapUtils模块:
(一)、简介:
1、加载Bitmap的时候无需考虑Bitmap加载过程中出现的OOM和Android容器快速滑动时候出现的图片错位等现象;
2、支持加载网络图片和本地图片;
3、内存管理使用LRU算法,更好的管理bitmap内存;
4、可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。

(二)、BitmapUtils 使用:

1、加载网络图片
BitmapUtils bitmapUtils = new BitmapUtils(this);

bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");

2、加载本地图片(路径以/开头, 绝对路径)
BitmapUtils bitmapUtils = new BitmapUtils(this);

bitmapUtils.display(testImageView, "/sdcard/test.jpg");

3、加载assets中的图片(路径以assets开头)
BitmapUtils bitmapUtils = new BitmapUtils(this);

bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");

4、使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片
BitmapUtils bitmapUtils = new BitmapUtils(this);

listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));

listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));

5、BitmapUtils中的config系列方法:
1)、 BitmapGlobalConfig配置

线程加载线程数量    bUtils.configThreadPoolSize(5); //配置线程池大小 
配置缓存 
路径:/data/data/{package}/cache/xx 
bUtils.configMemoryCacheEnabled(true) 
bUtils.configDefaultCacheExpiry(100*1024); //100k 

加载显示动画     bUtils.configDefaultImageLoadAnimation(Animation) 

2)、 BitmapDisplayConfig配置

  图片宽高 
   bUtils.configDefaultBitmapMaxSize(int w,int h) 
   bUtils.configDefaultBitmapMaxSize(BitmapSize bs) 
   new BitmapSize(int w,int h) 指定宽和高 
   BitmapCommonUtils.getScreenSize(context) 依据屏幕尺寸 

  默认显示图片 
   bUtils.configDefaultLoadingImage(int resId) 
   bUtils.configDefaultLoadingImage(Bitmap b) 
   bUtils.configDefaultLoadingImage(Drawable d) 

  下载失败图片 
   bUtils.configDefaultLoadFailedImage(int resId) 
   bUtils.configDefaultLoadFailedImage(Bitmap b) 
   bUtils.configDefaultLoadFailedImage(Drawable d) 

  图片保存质量 
   bUtils.configDefaultBitmapConfig(Bitmap.Config.RGB_565); 

五、DbUtils模块:
(一)、简介:
1、Android中的ORM框架,一行代码就可以进行增删改查;
2、支持事务,默认关闭;
3、可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);
4、支持绑定外键,保存实体时外键关联实体自动保存或更新;
5、自动加载外键关联实体,支持延时加载;
6、支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。

(二)、DbUtils 使用:

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 NULL

Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=", null));

// IS NOT NULL

Parent 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 pageOffset

List<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

...

核心代码:
private void initDbUtils() {
  DaoConfig config = new DaoConfig(getApplicationContext());
  config.setDbName("db_student.db");
  config.setDbVersion(3);
  config.setDbUpgradeListener(new DbUpgradeListener() {
   @Override
   public void onUpgrade(DbUtils db, int oldVersion, int newVersion) {
    if (newVersion > oldVersion) {
     try {
      db.dropDb();
     } catch (DbException e) {
      e.printStackTrace();
     }
    }
   }
  });

  dbUtils = DbUtils.create(config);
  dbUtils.configAllowTransaction(true);
  dbUtils.configDebug(true);
  try {
   dbUtils.createTableIfNotExist(Student.class);
  } catch (DbException e) {
   e.printStackTrace();
  }
 }

DbUtils中常用的CRUD操作方法:
1、insert:

dbUtils.save(student);

2、delete:

方法1: dbUtils.delete(Student.class, WhereBuilder.b("_id",
"=", id)); 
方法2: dbUtils.deleteById(Student.class, id); 
方法3: dbUtils.execNonQuery("delete from tb_student
where _id=" +  id); 
方法4: dbUtils.delete(student);

3、select:

dbUtils.findAll(Student.class);
dbUtils.findAll(Selector.from( Student.class).where("_id", "=", id));
dbUtils.findById();
dbUtils.execQuery();

4、update:

dbUtils.update(student);
dbUtils.update(student, WhereBuilder.b("_id", "=", id),  "username",
"password", "age");

六、其他功能:
(一)、输出日志LogUtils:
1、自动添加TAG,格式: className.methodName(L:lineNumber) 
2、可设置全局的LogUtils.allowD = false,LogUtils.allowI = false...,控制是否输出log。
3、自定义log输出LogUtils.customLogger = new xxxLogger();
LogUtils.d("wyouflf");

(二)、权限:
1、使用xUtils快速开发框架需要有以下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

(三)、混淆时注意事项:
1、添加Android默认混淆配置${sdk.dir}/tools/proguard/proguard-android.txt

2、不要混淆xUtils中的注解类型,添加混淆配置:-keep class * extends java.lang.annotation.Annotation { *; }
对使用DbUtils模块持久化的实体类不要混淆,或者注解所有表和列名称@Table(name="xxx"),@Id(column="xxx"),@Column(column="xxx"),@Foreign(column="xxx",foreign="xxx"); 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android xUtils 框架