xUtils类库的使用

序言:

作为一个职业的程序猿,不会像新手一样把每一个需要实现的功能每次重写一遍,因为程序猿能熟练的使用各种第三方类库。

毕竟人类因为会使用工具才站到了食物链顶端。

现在就让我们学习使用xUtils类库 中的四个工具类

开源代码来自于:https://github.com/wyouflf/xUtils

-------------------------------------------------------------------------------------------------------------------

xUtils简介

  • xUtils 包含了很多实用的android工具。
  • xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...
  • xUitls 最低兼容android 2.2 (api level 8)

xUtils权限:

1、联网权限

2、外部存储写入权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

--------------------------------------------------------------------------------------------------------------------

一、BitmapUtils 图像工具类

功能:

加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
支持加载网络图片和本地图片;
内存管理使用lru算法,更好的管理bitmap内存;
可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等...

加载图片

 1 BitmapUtils bitmapUtils = new BitmapUtils(this);
 2 
 3 // 加载网络图片 第一个参数:如果是ImageView控件,则显示图片,否则显示为背景,第二个参数图片网络地址
 4 bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");
 5 
 6 // 加载本地图片(路径以/开头, 绝对路径)
 7 bitmapUtils.display(testImageView, "/sdcard/test.jpg");
 8 
 9 // 加载assets中的图片(路径以assets开头)
10 bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");

加载网络图片时

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

对应display()方法 还有一个三个参数的方法
前两个参数不变,第三个参数为BitmapDisplayConfig对象,用于设置图片的配置
eg:
 1 BitmapDisplayConfig displayConfig = new BitmapDisplayConfig();
 2 displayConfig.setLoadFailedDrawable(Drawable)
 3 设置加载失败的图片
 4 displayConfig.setLoadingDrawable(Drawable) 
 5 设置加载中的图片
 6 displayConfig.setAutoRotation(boolean)
 7  有些JPEG图片,图片自身需要旋转才可以正常显示的情况,
 8 来进行设置是否自动支持旋转
 9 displayConfig.setAnimation(Animation)
10 用于实现要加载的View的显示动画,可用于ListView中
 1      BitmapDisplayConfig displayConfig = new BitmapDisplayConfig();
 2         //设置加载中的图片
 3         Resources resources = getResources();
 4         displayConfig.setLoadingDrawable(resources.getDrawable(R.drawable.ic_launcher));
 5         //设置加载失败的图片
 6         displayConfig.setLoadFailedDrawable(resources.getDrawable(android.R.drawable.ic_delete));
 7         //设置Bitmap像素的配置
 8         displayConfig.setBitmapConfig(Bitmap.Config.ARGB_8888);
 9         //设置内存中Bitmap最大的像素尺寸,减少内存占用
10         BitmapSize size = new BitmapSize(100,50);
11         displayConfig.setBitmapMaxSize(size);
12         //设置图片加载成功之后 到最终图片显示完成之间的动画效果
13         displayConfig.setAnimation(animation);
14 
15         bitmapUtils.display(imageView, url,displayConfig);

BitmapUtils默认配置设置

以上的使用可以看出每当我们要加载一个图片的时候,都需要设置该图片的一些配置

而xUtils给我们提供了默认设置,即只要设置属性一次即可

使用方法为:使用BitmapUtils 的 configDefaultXxxx()格式的方法

eg. 设置默认配置,加载三个网络图片,则该三个图片的属性是一样的

BitmapUtils bitmapUtils = new BitmapUtils(this);
        //设置默认的加载中的图片
        bitmapUtils.configDefaultLoadingImage(R.drawable.ic_launcher);
        //设置默认的加载失败的图片
        bitmapUtils.configDefaultLoadFailedImage(android.R.drawable.ic_delete);
        //设置默认的图片尺寸
        bitmapUtils.configDefaultBitmapMaxSize(new BitmapSize(100,50));
        //设置默认的加载超时时间
        bitmapUtils.configDefaultConnectTimeout(2000);
//加载第一张图片
 bitmapUtils.display(imageView1, url_1);

//加载第二张图片
 bitmapUtils.display(imageView2, url_2);

//加载第三张图片
 bitmapUtils.display(imageView3, url_3);

--------------------------------------------------------------------------------------------------------------------

二、ViewUtils视图相关工具类

功能:

  • android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
  • 新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
  • 目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event

1、注解

(1)关于注解:

  代码中以@开头的内容就是注解

  注解的类型:源代码注解、编译时注解、运行时注解

  注解应用的方式:类、方法、成员变量、参数

  注解的使用:注解的引用、注解的参数、注解的声明

(2)常见注解:

  @Override

  代表方法是重写了父类的方法

  @Deprecated

  代表修饰的内容已经过时了

  @SuppressWarnings

  代表忽略特定的代码检查

(3)注解类型

  源代码级别的注解:存在于源代码中,但不会进行编译操作,也就是不会出现在类文件中

  类文件级别(编译时)的注解:存在于类文件中,但不会被JVM加载

  运行级别的注解:JVM运行时,会加载到JVM中

(4)注解的创建

  1、创建.java的文件;选择Annotation。

  2、创建出的注解代码以@interface作为标示,就像class一样。

  3、指定注解能够应用在哪些范围上,例如:类、方法、成员变量、参数当中的哪些部分。

     给注解指定@Target注解。

(5)注解的属性和参数

  1.注解中指定的属性和参数,是需要在源代码开发的时候指定的,永远不会变。

  2.因为代码中的注解,在编译之后,固化在class文件里了。

  3.通过反射,可以获取成员变量的注解信息,以及获取注解的参数。

2、ViewUtils的使用

(1)ViewUtils.inject(); 

语句的注入  

  用途:用于加载当前类中所有相关的注解

 1 //在Activity中注入:
 2 @Override
 3 public void onCreate(Bundle savedInstanceState) {
 4     super.onCreate(savedInstanceState);
 5     setContentView(R.layout.main);
 6     ViewUtils.inject(this); //注入view和事件
 7     ...
 8     textView.setText("some text...");
 9     ...
10 }
11 //在Fragment中注入:
12 @Override
13 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
14     View view = inflater.inflate(R.layout.bitmap_fragment, container, false); // 加载fragment布局
15     ViewUtils.inject(this, view); //注入view和事件
16     ...
17 }
18 //在PreferenceFragment中注入:
19 public void onActivityCreated(Bundle savedInstanceState) {
20     super.onActivityCreated(savedInstanceState);
21     ViewUtils.inject(this, getPreferenceScreen()); //注入view和事件
22     ...
23 }

(2)xUtils视图注解的应用

  注解描述信息,ViewUtils.inject()动态加载、分析注解

  1、描述:setContentView @ContentView(R.layout.xxx)

  2、描述:findViewById @ViewInject(R.id.xxx)

  3、描述事件监听器:@OnClick(R.id.xxx) .....

  4、描述各种资源:@ResInject(id=R.xx.xx,type=ResTypes.XXX)

eg:

// xUtils的view注解要求必须提供id,以使代码混淆不受影响。
@ViewInject(R.id.textView)
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) { // 方法签名必须和接口中的要求一致
    ...
}

--------------------------------------------------------------------------------------------------------------------

三、DbUtils 数据库相关工具类

功能:

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

使用步骤:

1、编写实体类

  1 package com.xqxapp.finance.bean;
  2 
  3 import android.graphics.Bitmap;
  4 import com.lidroid.xutils.db.annotation.Column;
  5 import com.lidroid.xutils.db.annotation.Id;
  6 import com.lidroid.xutils.db.annotation.Table;
  7 
  8 /**
  9  * Created
 10  * Author: xqx
 11  * Date: 15-10-9
 12  */
 13 @Table(name = "account")
 14 public class Account {
 15 
 16     @Id
 17     private long _id;
 18     @Column
 19     private int money_type; //类型:支出/收入
 20     @Column
 21     private float money; //金额
 22     @Column
 23     private String type;  //支出用途/收入来源
 24     @Column
 25     private String way;  //金额类型:现金 支付宝。。。
 26     @Column
 27     private String remarks; //备注
 28     @Column
 29     private String time;  //时间
 30     @Column
 31     private String people;  //群体
 32 
 33 
 34     private Bitmap image; //存单
 35 
 36 
 37     public long getId() {
 38         return _id;
 39     }
 40 
 41     public void setId(long id) {
 42         this._id = id;
 43     }
 44 
 45     public int getMoney_type() {
 46         return money_type;
 47     }
 48 
 49     public void setMoney_type(int money_type) {
 50         this.money_type = money_type;
 51     }
 52 
 53     public float getMoney() {
 54         return money;
 55     }
 56 
 57     public void setMoney(float money) {
 58         this.money = money;
 59     }
 60 
 61     public String getType() {
 62         return type;
 63     }
 64 
 65     public void setType(String type) {
 66         this.type = type;
 67     }
 68 
 69     public String getWay() {
 70         return way;
 71     }
 72 
 73     public void setWay(String way) {
 74         this.way = way;
 75     }
 76 
 77     public String getRemarks() {
 78         return remarks;
 79     }
 80 
 81     public void setRemarks(String remarks) {
 82         this.remarks = remarks;
 83     }
 84 
 85     public String getTime() {
 86         return time;
 87     }
 88 
 89     public void setTime(String time) {
 90         this.time = time;
 91     }
 92 
 93     public String getPeople() {
 94         return people;
 95     }
 96 
 97     public void setPeople(String people) {
 98         this.people = people;
 99     }
100 
101     public Bitmap getImage() {
102         return image;
103     }
104 
105     public void setImage(Bitmap image) {
106         this.image = image;
107     }
108 }

数据库实体定义

利用@Table定义数据库实体对应的表

利用@Id标识主键

利用@Column标记数据库表的列字段

利用@Finder查找多个实体关系

2、DbUtils的创建

1 DbUtils.create(this,app.db);

参数一:上下文   参数二:数据文件名

3、添加记录

Account account = new Account();
               account.setMoney(Float.parseFloat(et_money.getText().toString()));
               account.setMoney_type(MONEY_TYPE);
               account.setPeople("");
               account.setRemarks("");
               account.setTime(time.getText().toString());
               account.setType("");
               account.setWay(way.getText().toString());
DbUtils.save(account)

--------------------------------------------------------------------------------------------------------------------

四、HttpUtils 网络相关工具类

功能:

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

1、Get异步请求数 HttpUtils httpUtils = new HttpUtils(5000,"xxx[Android]");

//第一个参数,连接超时时间 ,第二个参数 userAgent 客户端标识,可以随便写

//2、联网
        httpUtils.send(HttpRequest.HttpMethod.GET,
                "http://www.baidu.com",
                new RequestCallBack<String>() {
                    //请求成功时回调
                    @Override
                    public void onSuccess(ResponseInfo<String> responseInfo) {
                        // 请求数据成功后的操作

                    }

                    //请求失败时回调
                    @Override
                    public void onFailure(HttpException e, String s) {
              //请求数据失败后的操作
                    }
                });

2、Get 同步请求数据

try {     
            ResponseStream responseStream = httpUtils.sendSync(HttpRequest.HttpMethod.GET, "http://www.163.com"
            );
            int statusCode = responseStream.getStatusCode();
            if(statusCode==200){
                //进行数据的操作
                }
            }

            responseStream.close();
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

3、Post 上传

HttpUtils httpUtils = new HttpUtils(5000);
        //POST请求的参数准备
        //按参数提交数据
        //参数的提交需要指定编码:也就是new RequestParams("字符编码");
        //服务器 需要什么编码,客户端就要设置对应的编码

        // 指定字符编码
        RequestParams params = new RequestParams("UTF-8");
        //1、设置参数 POST 内容 //在网址之后自动加入http://11.1.163.24:8080/post?a=123
        params.addQueryStringParameter("a","123");
        //POST 请求大部分都需要BodyParameter
        params.addBodyParameter("name","admin");
        params.addBodyParameter("password", "123456");

        //1.1 如果需要附加http头字段 ,
        params.addHeader("User-Agent","Zhang Sir");


        httpUtils.send(
                HttpRequest.HttpMethod.POST,     //post方式
                "http://11.1.163.24:8080/post", //网址接口
                params,
                new RequestCallBack<String>() {

                    @Override
                    public void onSuccess(ResponseInfo<String> responseInfo) {
                        txtInfo.setText(responseInfo.result);
                    }

                    @Override
                    public void onFailure(HttpException e, String s) {
                        txtInfo.setText("请求失败");
                    }
                }
        );

4、下载

HttpUtils httpUtils = new HttpUtils(5000);
        //1、下载文件

        //获取存储卡路径
        String state = Environment.getExternalStorageState();
        //判断是否挂载成功
        if(Environment.MEDIA_MOUNTED.equals(state)) {
            File root = Environment.getExternalStorageDirectory();
            //目标文件对象
            File targetFile = new File(root,"xmly1.apk");

            //进行文件的下载
            HttpHandler<File> download = httpUtils.download("http://11.1.163.24:8080/ximalayatingshu_64.apk",
                    targetFile.getAbsolutePath(), //保存路径
                    true,                         //autoResume 是否断点续传,false 则可以重命名下载,true 则下载成功的不再下载,执行下载失败接口回调
                    true,                         //autoRename 自动重命名
                    new RequestCallBack<File>() { //回调
                        @Override
                        public void onSuccess(ResponseInfo<File> responseInfo) {
                            //返回下载成功的File对象
                            Toast.makeText(getApplicationContext(), "success", Toast.LENGTH_SHORT).show();
                        }

                        @Override
                        public void onFailure(HttpException e, String s) {
                            Toast.makeText(getApplicationContext(), "failure", Toast.LENGTH_SHORT).show();
                        }

                        /**
                         * 当前网络请求:上传下载的进度的更新回调
                         * @param total          总长度
                         * @param current        当前进度
                         * @param isUploading    是否上传 true上传 false 下载
                         */
                        @Override
                        public void onLoading(long total, long current, boolean isUploading) {
                            super.onLoading(total, current, isUploading);
                            //TODO 更新进度条
                           

                        }
                    }
            );



        }

HttpUtils的特点:

1.支持文件上传,Volley不支持;

2.支持文件下载,上传下载,支持进度,Volley不支持;

3.使用HttpClient,在Android5.0已经不在内置HttpCleint,使用Gradle开发,针对Android5.0之后,就需要添加一个过时包才可以继续使用;

4.使用异步任务,速度比Volley要慢。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android干货园

Retrofit--使用Retrofit时怎样去设置OKHttp

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/51...

972
来自专栏我的博客

安卓开发之调试程序

一、DDMS中LogCat(这样就能调试程序了) 代码下方显示LogCat,windows/show view/other选中logcat点击ok就会在代码下面...

3538
来自专栏以南小隐-数通那些事儿

锐捷设备主程序下升级方法

1684
来自专栏非著名程序员

Android:全面解析熟悉而陌生 的 Application 类使用

前言 Applicaiton类在 Android开发中非常常见,可是你真的了解Applicaiton类吗? 本文将全面解析Applicaiton类,包括特点、方...

2295
来自专栏月牙寂

k8s源码分析-----kubectl(3)主要框架

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

6184
来自专栏Android-JessYan

看到如此多的MVP+Dagger2+Retrofit+Rxjava项目,轻松拿star,心动了吗?

原文地址: http://www.jianshu.com/p/4bbecd0bb027

5393
来自专栏Android开发指南

6.网络编程

33213
来自专栏坚毅的PHP

mysql 高并发更新计数问题

问题:功能为链接的点击计数,其他两个计数更新 还有两个内容表的插入,只插入链接对应的id,分4个库,共128个表,mysql每天有5000万次插入和5000万次...

4718
来自专栏佳爷的后花媛

Android基础面试题

第一部分(Part1)Android基础测试 共22题(全部单选,每题2分,总分44分 ) 1、关于在Activity生命周期中的各个方法在不同状态下的调用顺...

2562
来自专栏向治洪

LeakCanary使用手册

demo 一个非常简单的 LeakCanary demo: https://github.com/liaohuqiu/leakcanary-demo 开始使用 ...

2628

扫码关注云+社区

领取腾讯云代金券