zoukankan      html  css  js  c++  java
  • 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 }
    bean实体类
    数据库实体定义
    利用@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要慢。

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

    关于开源代码作者

    • Email: wyouflf@qq.comwyouflf@gmail.com
    • 有任何建议或者使用中遇到问题都可以给我发邮件, 你也可以加入QQ群:330445659(已满), 275967695, 257323060,技术交流,idea分享 _
  • 相关阅读:
    Jquery中的this指向的是哪个对象?
    需要重新编辑
    关于CSS选择器优先级无冲突样式设置的展示
    在 CSS 中,width 和 height 指的是内容区域的宽度和高度
    关于正则表达式中分组的一些误解勘正以及String的replaceAll方法误解勘正
    关于informatica的Dynamic Lookup组件使用中遇到的一个问题的思考
    【转】Informatica Update 机制详解
    维度表和事实表的含义
    今天看IO流,复制word遇到的一个小问题
    小试下新博客,一个列传行的SQL
  • 原文地址:https://www.cnblogs.com/xqxacm/p/4868209.html
Copyright © 2011-2022 走看看