xUtils類庫的使用

weixin_33806914發表於2015-10-10

序言:

作為一個職業的程式猿,不會像新手一樣把每一個需要實現的功能每次重寫一遍,因為程式猿能熟練的使用各種第三方類庫。

畢竟人類因為會使用工具才站到了食物鏈頂端。

現在就讓我們學習使用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分享 _

相關文章