Xutils常用方法

xUtils簡介

  • xUtils 包含了很多實用的android工具。
  • xUtils 最初源於Afinal框架,進行了大量重構,使得xUtils支持大文件上傳,更全面的http請求協議支持(10種謂詞),擁有更加靈活的ORM,更多的事件註解支持且不受混淆影響…
  • 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快速開發框架需要有以下權限:

<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使用方法:

DbUtils db = DbUtils.create(this);
User user = new User(); //這裏需要注意的是User對象必須有id屬性,或者有通過@ID註解的屬性
user.setEmail("[email protected]");
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
...

ViewUtils使用方法

  • 完全註解方式就可以進行UI綁定和事件綁定。
  • 無需findViewById和setClickListener等。
// 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中注入:
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ViewUtils.inject(this); //注入view和事件
    ...
    textView.setText("some text...");
    ...
}
//在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和事件
    ...
}
//在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方法

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方法)

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下載文件:

  • 支持斷點續傳,隨時停止下載任務,開始任務
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 使用方法

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));

下面依次開始介紹這些組件具體的使用。

一、ViewUtils  android中得ioc(控制反轉)框架,可以完全使用註解的方式來完成UI的綁定和事件綁定。簡單的說,ViewUtils的功能就是做這個的,但是可以說,就這麼個功能確是能極大的簡化我們的代碼。下面我們看下具體的代碼,順便對比下註解的方式綁定ID和findViewById之間的差別。

  1. @ViewInject(R.id.btn)    
  2. private Button btn;    
  3.     
  4. @ViewInject(R.id.img)    
  5. private ImageView img;    
  6.     
  7. @ViewInject(R.id.list)    
  8. private ListView list;    
  9.     
  10. @Override    
  11. protected void onCreate(Bundle savedInstanceState) {    
  12.     super.onCreate(savedInstanceState);    
  13.     setContentView(R.layout.activity_second);    
  14.     ViewUtils.inject(this);}    
    @ViewInject(R.id.btn)  
    private Button btn;  

    @ViewInject(R.id.img)  
    private ImageView img;  

    @ViewInject(R.id.list)  
    private ListView list;  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_second);  
        ViewUtils.inject(this);}  

  1. @Override    
  2. protected void onCreate(Bundle savedInstanceState) {    
  3.     super.onCreate(savedInstanceState);    
  4.     setContentView(R.layout.activity_second);    
  5.         
  6.     btn = (Button) findViewById(R.id.btn);    
  7.     img = (ImageView) findViewById(R.id.img);    
  8.     list = (ListView) findViewById(R.id.list);    
  9.         
  10. }    
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_second);  

        btn = (Button) findViewById(R.id.btn);  
        img = (ImageView) findViewById(R.id.img);  
        list = (ListView) findViewById(R.id.list);  

    }  
如果項目中得Activity中的控件相當多,那麼想象一下代碼中累積的那一大坨就真心受不了。通過xUtils的簡單註解,就能輕鬆擺脫無盡壞味道的代碼。

注意:在使用註解綁定控件的時候,一定記得在onCreate中調用ViewUtils.inject(this);

下面我們再對比下Android中事件綁定的區別。

  1. @OnClick({ R.id.btn, R.id.img })    
  2. public void clickMethod(View v) {    
  3.     Toast.makeText(SecondActivity.this, “you clicked button!”,    
  4.             Toast.LENGTH_SHORT).show();    
  5. }    
  6.   
  7. @OnItemClick(R.id.list)    
  8. public void itemClick(AdapterView<?> parent, View view, int position,long id) {    
  9.     Toast.makeText(SecondActivity.this, “position—>“ + position,    
  10.             Toast.LENGTH_SHORT).show();    
  11. }   
    @OnClick({ R.id.btn, R.id.img })  
    public void clickMethod(View v) {  
        Toast.makeText(SecondActivity.this, "you clicked button!",  
                Toast.LENGTH_SHORT).show();  
    }  

    @OnItemClick(R.id.list)  
    public void itemClick(AdapterView<?> parent, View view, int position,long id) {  
        Toast.makeText(SecondActivity.this, "position--->" + position,  
                Toast.LENGTH_SHORT).show();  
    } 

  1. btn.setOnClickListener(this);    
  2. list.setOnItemClickListener(new OnItemClickListener() {    
  3.     @Override    
  4.     public void onItemClick(AdapterView<?> parent, View view,    
  5.             int position, long id) {    
  6.         Toast.makeText(SecondActivity.this, “position—>“ + position,    
  7.                 Toast.LENGTH_SHORT).show();    
  8.     }    
  9. });  
  10. @Override    
  11. public void onClick(View v) {    
  12.     switch (v.getId()) {    
  13.     case R.id.btn:    
  14.          Toast.makeText(SecondActivity.this, “you clicked button!”,    
  15.             Toast.LENGTH_SHORT).show();    
  16.          break;    
  17.     default:    
  18.         break;    
  19.     }    
  20. }  
        btn.setOnClickListener(this);  
        list.setOnItemClickListener(new OnItemClickListener() {  
            @Override  
            public void onItemClick(AdapterView<?> parent, View view,  
                    int position, long id) {  
                Toast.makeText(SecondActivity.this, "position--->" + position,  
                        Toast.LENGTH_SHORT).show();  
            }  
        });
        @Override  
        public void onClick(View v) {  
            switch (v.getId()) {  
            case R.id.btn:  
                 Toast.makeText(SecondActivity.this, "you clicked button!",  
                    Toast.LENGTH_SHORT).show();  
                 break;  
            default:  
                break;  
            }  
        }
原本綁定Button的監聽事件要麼用醜陋的內部類,要麼Activity實現OnClickListener,在複寫的onClick方法中去根據id。而xUtils只要通過簡單的一句註解就能實現監聽事件的功能,而且可以實現多個控件共用一個監聽方法。同時xUtils提供onClick、onItemClick、onLongClick等15種事件監聽註解。

注意:在使用註解監聽事件的時候,監聽方法名是自定義的,但是一定要保證方法的訪問修飾符爲public,同時方法的參數要與Android原來的監聽方法參數一致,不僅參數類型,而且要保證參數的順序。

二、BitmapUtils  加載網絡或本地bitmap的時候無需擔心再遇到OOM的現象,管理bitmap的內存採用了LRU算法,同時也能避免列表滑動過程中發生圖片錯位等得現象。加載網絡圖片時,還可以配置運行線程的數量,緩存路徑等。。。通過BitmapUtils的各種構造器,可以很方便的創建出本地緩存路徑和緩存的大小,以及內存緩存的大小。
  1. BitmapUtils utils = new BitmapUtils(this);    
  2. BitmapDisplayConfig config = new BitmapDisplayConfig(this);    
  3. config.setLoadingDrawable(getResources().getDrawable(R.drawable.loading));    
  4. config.setLoadFailedDrawable(getResources().getDrawable(R.drawable.failed));    
  5. config.setImageLoadCallBack(new ImageLoadCallBack() {    
  6.     @Override    
  7.     public void loadFailed(ImageView imageView, Drawable drawable) {    
  8.     }    
  9.     @Override    
  10.     public void loadCompleted(ImageView imageView, Drawable drawable,    
  11.             BitmapDisplayConfig config) {    
  12.     }    
  13. });    
  14. config.setBitmapMaxWidth(480);    
  15. config.setBitmapMaxHeight(720);    
  16. utils.display(img, “http://img1.gtimg.com/news/pics/hv1/63/26/1451/94357968.jpg”);    
  17. utils.display(img, “http://img1.gtimg.com/news/pics/hv1/63/26/1451/94357968.jpg”, config);  
    BitmapUtils utils = new BitmapUtils(this);  
    BitmapDisplayConfig config = new BitmapDisplayConfig(this);  
    config.setLoadingDrawable(getResources().getDrawable(R.drawable.loading));  
    config.setLoadFailedDrawable(getResources().getDrawable(R.drawable.failed));  
    config.setImageLoadCallBack(new ImageLoadCallBack() {  
        @Override  
        public void loadFailed(ImageView imageView, Drawable drawable) {  
        }  
        @Override  
        public void loadCompleted(ImageView imageView, Drawable drawable,  
                BitmapDisplayConfig config) {  
        }  
    });  
    config.setBitmapMaxWidth(480);  
    config.setBitmapMaxHeight(720);  
 // utils.display(img, "http://img1.gtimg.com/news/pics/hv1/63/26/1451/94357968.jpg");  
    utils.display(img, "http://img1.gtimg.com/news/pics/hv1/63/26/1451/94357968.jpg", config);
BitmapUtils在用來加載網絡圖片時,可以配置加載圖片尺寸的大小,加載成功和失敗的回調以及加載過程中圖片的配置。同時也可以選擇不配置。
  1. //bitmapUtils.display(testImageView, ”/sdcard/test.jpg”); //支持加載本地圖片    
  2.   // 使用ListView等容器展示圖片時可通過PauseOnScrollListener控制滑動和快速滑動過程中時候暫停加載圖片    
  3. listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));    
  4. listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true), customListener);   
//bitmapUtils.display(testImageView, "/sdcard/test.jpg"); //支持加載本地圖片  
  // 使用ListView等容器展示圖片時可通過PauseOnScrollListener控制滑動和快速滑動過程中時候暫停加載圖片  
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));  
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true), customListener); 
三、DbUtils操縱數據庫的工具類,無論多牛X,總離不開最根本的CRUD,即創建,查詢,更新和刪除。下面從這四個角度依次介紹xUtils是如何簡便持久化數據的。大家都知道,在Android裏面如果要存儲一個對象,我們需要創建一個SQLiteOpenHelper,然後還得創建一張對應對象各個屬性的表,還得繼續把我們的對象轉換成ContentValues,進而去存儲。真心是麻煩的不能再麻煩了,我們現在介紹的DbUtils就能讓你輕鬆解脫麻繩一樣的代碼。DbUtils在進行save操作的時候,會根據java反射反射出對象的各個字段,然後去查詢數據庫中是否存在這個對象類型對應的表,如果表已經存在,直接進行插入操作;如果不存在,就先動態的創建的一張對應我們對象的表,再進行插入處理。直接上代碼,大家看。
  1. @OnClick(R.id.insert)    
  2. public void insert(View v) {    
  3.     Student stu = null;    
  4.     for (int i = 0; i < 20; i++) {    
  5.         stu = new Student();    
  6.         stu.setAge(10 + i);    
  7.         stu.setName(“jack” + i);    
  8.         mList.add(stu);    
  9.         try {    
  10.             dbUtils.save(stu);    
  11.         } catch (DbException e) {    
  12.             e.printStackTrace();    
  13.         }    
  14.     }    
  15. }    
    @OnClick(R.id.insert)  
    public void insert(View v) {  
        Student stu = null;  
        for (int i = 0; i < 20; i++) {  
            stu = new Student();  
            stu.setAge(10 + i);  
            stu.setName("jack" + i);  
            mList.add(stu);  
            try {  
                dbUtils.save(stu);  
            } catch (DbException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
注意:並不是所有的實體對象都快可以通過這種方式去存儲,一定要保證對象的類型中有int類型的id或者_id的屬性,這就對應數據庫表中的主鍵字段。如果類型中沒有id字段,可以通過@Id註解去指定一個int類型的字段作爲主鍵。如果表中的又字段不想被存儲在數據庫中,也可以通過@Transient去實現忽略。如果直接存儲一個對象的列表,這樣也是被允許的,達到批量存儲的目的。

DbUtils可以幫助對SQL語句不是很熟悉的同學快速的實現查詢,而不用去寫sql查詢語句,而且可以對查詢結果進行排序和分頁,使用簡單,功能強大。大家可以看下,下面的幾行代碼就能實現複雜的查詢功能

  1. dbUtils.findAll(Selector.from(Student.class).where(“_id”, ”<“, 10).and(“age”, ”>“, 10).orderBy(“_id”).limit(pageSize).offset(pageSize * pageIndex));   
dbUtils.findAll(Selector.from(Student.class).where("_id", "<", 10).and("age", ">", 10).orderBy("_id").limit(pageSize).offset(pageSize * pageIndex)); 
同樣的,也可以對數據庫中得數據進行便捷的更新。下面演示的是更新Student對應的表中的第一條記錄的age這個字段。這個比較簡單,就直接上代碼看吧。
  1. @OnClick(R.id.update)    
  2. public void update(View v){    
  3.     try {    
  4.         List<Student> stus = dbUtils.findAll(Selector.from(Student.class));    
  5.         Student stu = stus.get(0);    
  6.         stu.setAge(20);    
  7.         dbUtils.update(stu);    
  8.     } catch (DbException e) {    
  9.         e.printStackTrace();    
  10.     }    
  11. }    
    @OnClick(R.id.update)  
    public void update(View v){  
        try {  
            List<Student> stus = dbUtils.findAll(Selector.from(Student.class));  
            Student stu = stus.get(0);  
            stu.setAge(20);  
            dbUtils.update(stu);  
        } catch (DbException e) {  
            e.printStackTrace();  
        }  
    }  
最後一個就是數據的刪除。一個實體對象,一組實體對象,根據條件刪除,刪除表,刪除整個數據庫,這些操作都可以通過一句簡單的代碼來實現,看了代碼就明白了。
  1. @OnClick(R.id.delete)    
  2. public void delete(View v){    
  3.     try {    
  4.         List<Student> stus = dbUtils.findAll(Selector.from(Student.class));    
  5.         dbUtils.delete(stus.get(0));    
  6.         dbUtils.deleteAll(stus);    
  7.         dbUtils.deleteById(Student.class, WhereBuilder.b(“age”, ”==”, 20));    
  8.         dbUtils.dropTable(Student.class);    
  9.         dbUtils.dropDb();    
  10.     } catch (DbException e) {    
  11.         e.printStackTrace();    
  12.     }    
  13. }    
@OnClick(R.id.delete)  
public void delete(View v){  
    try {  
        List<Student> stus = dbUtils.findAll(Selector.from(Student.class));  
        dbUtils.delete(stus.get(0));  
        dbUtils.deleteAll(stus);  
        dbUtils.deleteById(Student.class, WhereBuilder.b("age", "==", 20));  
        dbUtils.dropTable(Student.class);  
        dbUtils.dropDb();  
    } catch (DbException e) {  
        e.printStackTrace();  
    }  
}  
四、HttpUtils是解決日常工作過程中繁雜的上傳下載文件以及各種Get和post請求的必備工具類,通過這個類,開源非常方便關注接口的業務,不必再再寫那麼冗長的代碼。下面全文都圍繞着四個中心點去依次展開,分別是:HttpGet請求,HttpPost請求,下載文件和上傳文件。

HttpGet請求。相信從事Android網絡應用的開發的同學對這個一定不會陌生,長期的開發會讓大家積累下一個可以複用的工具類。而xUtils就是幫助了我們把那些工具類給抽象整合成一個更具擴展性的幫助類。比如HtttpGet請求,這裏只簡要介紹下關鍵的應用方法,具體的細節還請大家自己去下載xUtils的源碼去研究研究了,我們介紹的足夠應用到我們的應用開發中去了。通常的HttpGet請求會把一系列的請求參數掛在請求地址的後面,拖出一節長長的尾巴,十分的惹人厭,這裏可以通過像HttpPost請求的參數那樣組成一個類似BasicNameValuePair的對象直接封裝到請求方法中去,省去拼接url的麻煩,同時也可以設置超時時間。另外請求的方法中提供了一個回調類,這個類中有處理不同請求結果的回調方法,比如說請求過程中的回調,請求成功的回調以及請求出現錯誤時的回調。下面直接上代碼看下。
  1. RequestParams params = new RequestParams();    
  2. params.addQueryStringParameter(“method”, “info”);    
  3. params.addQueryStringParameter(“access_token”,    
  4.         “3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414”);    
  5.   
  6. HttpUtils http = new HttpUtils();    
  7. http.configCurrentHttpGetCacheExpiry(1000 * 10);    
  8. http.send(HttpRequest.HttpMethod.GET,    
  9.         “https://pcs.baidu.com/rest/2.0/pcs/quota”,    
  10.         params,    
  11.         new RequestCallBack<String>() {    
  12.   
  13.             @Override    
  14.             public void onStart() {    
  15.                 resultText.setText(“conn…”);    
  16.             }    
  17.   
  18.             @Override    
  19.             public void onLoading(long total, long current) {    
  20.                 resultText.setText(current + ”/” + total);    
  21.             }    
  22.   
  23.             @Override    
  24.             public void onSuccess(String result) {    
  25.                 resultText.setText(“response:” + result);    
  26.             }    
  27.   
  28.   
  29.             @Override    
  30.             public void onFailure(HttpException error, String msg) {    
  31.                 resultText.setText(msg);    
  32.             }    
  33.         });  
     RequestParams params = new RequestParams();  
     params.addQueryStringParameter("method", "info");  
     params.addQueryStringParameter("access_token",  
             "3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414");  

     HttpUtils http = new HttpUtils();  
     http.configCurrentHttpGetCacheExpiry(1000 * 10);  
     http.send(HttpRequest.HttpMethod.GET,  
             "https://pcs.baidu.com/rest/2.0/pcs/quota",  
             params,  
             new RequestCallBack<String>() {  

                 @Override  
                 public void onStart() {  
                     resultText.setText("conn...");  
                 }  

                 @Override  
                 public void onLoading(long total, long current) {  
                     resultText.setText(current + "/" + total);  
                 }  

                 @Override  
                 public void onSuccess(String result) {  
                     resultText.setText("response:" + result);  
                 }  


                 @Override  
                 public void onFailure(HttpException error, String msg) {  
                     resultText.setText(msg);  
                 }  
             });

HttpPost請求。爲了統一請求的風格,HttpPost請求的方式和HttpGet的幾乎可以說是一模一樣,一樣提供了各種對應不同結果的回調方法,大家自己看下面的代碼就曉得了,真是一目瞭然。
  1. RequestParams params = new RequestParams();    
  2. params.addQueryStringParameter(“method”, “mkdir”);    
  3. params.addQueryStringParameter(“access_token”, “3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414”);    
  4. params.addBodyParameter(“path”, ”/apps/測試應用/test文件夾”);    
  5.   
  6. HttpUtils http = new HttpUtils();    
  7. http.send(HttpRequest.HttpMethod.POST,    
  8.         “https://pcs.baidu.com/rest/2.0/pcs/file”,    
  9.         params,    
  10.         new RequestCallBack<String>() {    
  11.   
  12.             @Override    
  13.             public void onStart() {    
  14.                 resultText.setText(“conn…”);    
  15.             }    
  16.   
  17.             @Override    
  18.             public void onLoading(long total, long current) {    
  19.                 resultText.setText(current + ”/” + total);    
  20.             }    
  21.   
  22.             @Override    
  23.             public void onSuccess(String result) {    
  24.                 resultText.setText(“upload response:” + result);    
  25.             }    
  26.   
  27.   
  28.             @Override    
  29.             public void onFailure(HttpException error, String msg) {    
  30.                 resultText.setText(msg);    
  31.             }    
  32.         });   
       RequestParams params = new RequestParams();  
       params.addQueryStringParameter("method", "mkdir");  
       params.addQueryStringParameter("access_token", "3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414");  
       params.addBodyParameter("path", "/apps/測試應用/test文件夾");  

       HttpUtils http = new HttpUtils();  
       http.send(HttpRequest.HttpMethod.POST,  
               "https://pcs.baidu.com/rest/2.0/pcs/file",  
               params,  
               new RequestCallBack<String>() {  

                   @Override  
                   public void onStart() {  
                       resultText.setText("conn...");  
                   }  

                   @Override  
                   public void onLoading(long total, long current) {  
                       resultText.setText(current + "/" + total);  
                   }  

                   @Override  
                   public void onSuccess(String result) {  
                       resultText.setText("upload response:" + result);  
                   }  


                   @Override  
                   public void onFailure(HttpException error, String msg) {  
                       resultText.setText(msg);  
                   }  
               }); 

下面爲大家介紹一個非常非常實用的功能,就是通過Http協議去下載文件。再也不必爲Android中下載文件而寫下一大坨一大坨的代碼,如此長的代碼調試起來真是能氣死人。還記得以前做過一個項目,有個需求就是能下載視頻的,而且還要能支持斷點下載,只寫那麼一個下載工具類就寫了一兩天,再加上調試,真心把人都給逼瘋了。要是xUtils早點在那個時候面世,想那時做那個需求也不必那麼通過。HttpUtils爲開發者提供了非常方便的下載api,可以通過簡單的幾個參數來實現下載,甚至斷點下載的功能。上代碼。
  1. HttpHandler  handler = http.download(    
  2.                 downloadAddrEdit.getText().toString(),    
  3.                 ”/sdcard/fileexplorer.apk”,    
  4.                 true, // 如果目標文件存在,接着未完成的部分繼續下載。    
  5.                 true, // 如果從請求返回信息中獲取到文件名,下載完成後自動重命名。    
  6.                 new RequestCallBack<File>() {     
  7.     
  8.                     @Override    
  9.                     public void onStart() {    
  10.                         resultText.setText(“conn…”);    
  11.                     }    
  12.     
  13.                     @Override    
  14.                     public void onLoading(long total, long current) {    
  15.                         resultText.setText(current + ”/” + total);    
  16.                     }    
  17.     
  18.                     @Override    
  19.                     public void onSuccess(File result) {    
  20.                         resultText.setText(“downloaded:” + result.getPath());    
  21.                     }    
  22.     
  23.                     @Override    
  24.                     public void onFailure(HttpException error, String msg) {    
  25.                         resultText.setText(error.getExceptionCode() + ”:” + msg);    
  26.                     }    
  27.                 });    
HttpHandler  handler = http.download(  
                downloadAddrEdit.getText().toString(),  
                "/sdcard/fileexplorer.apk",  
                true, // 如果目標文件存在,接着未完成的部分繼續下載。  
                true, // 如果從請求返回信息中獲取到文件名,下載完成後自動重命名。  
                new RequestCallBack<File>() {   

                    @Override  
                    public void onStart() {  
                        resultText.setText("conn...");  
                    }  

                    @Override  
                    public void onLoading(long total, long current) {  
                        resultText.setText(current + "/" + total);  
                    }  

                    @Override  
                    public void onSuccess(File result) {  
                        resultText.setText("downloaded:" + result.getPath());  
                    }  

                    @Override  
                    public void onFailure(HttpException error, String msg) {  
                        resultText.setText(error.getExceptionCode() + ":" + msg);  
                    }  
                });  
注意:下載過程中如果需要暫停下載,也只需簡單的一行代碼來實現:mHandler.stop(),如果設置斷點下載的話,下次會重新開始的話,會自動從上次下載的斷點處繼續下載。

最後介紹的功能就是上傳文件了,這個也是在項目中也是非常常見的。比如用戶上傳頭像,再比如網盤應用需要把本地文件上傳到雲端等等。同時HttpUtils也同時爲開發者提供了上傳過程中和上傳結果的各個回調接口。大家在使用HttpUtils上傳文件的時候,只要仿照下面的代碼去碼代碼就快可以基本滿足業務的需要了。
  1. RequestParams params = new RequestParams();    
  2.         params.addQueryStringParameter(“method”, “upload”);    
  3.         params.addQueryStringParameter(“path”, ”/apps/測試應用/test.zip”);    
  4.         // 請在百度的開放access_tokenapi測試頁面找到自己的access_token    
  5.         params.addQueryStringParameter(“access_token”, “3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414”);    
  6.         params.addBodyParameter(“file”, new File(“/sdcard/test.zip”));    
  7.     
  8.         HttpUtils http = new HttpUtils();    
  9.         http.send(HttpRequest.HttpMethod.POST,    
  10.                 “https://pcs.baidu.com/rest/2.0/pcs/file”,    
  11.                 params,    
  12.                 new RequestCallBack<String>() {    
  13.     
  14.                     @Override    
  15.                     public void onStart() {    
  16.                         resultText.setText(“conn…”);    
  17.                     }    
  18.     
  19.                     @Override    
  20.                     public void onLoading(long total, long current) {    
  21.                         resultText.setText(current + ”/” + total);    
  22.                     }    
  23.     
  24.                     @Override    
  25.                     public void onSuccess(String result) {    
  26.                         resultText.setText(“upload response:” + result);    
  27.                     }    
  28.     
  29.     
  30.                     @Override    
  31.                     public void onFailure(HttpException error, String msg) {    
  32.                         resultText.setText(msg);    
  33.                     }    
  34.                 });    
RequestParams params = new RequestParams();  
        params.addQueryStringParameter("method", "upload");  
        params.addQueryStringParameter("path", "/apps/測試應用/test.zip");  
        // 請在百度的開放access_tokenapi測試頁面找到自己的access_token  
        params.addQueryStringParameter("access_token", "3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414");  
        params.addBodyParameter("file", new File("/sdcard/test.zip"));  

        HttpUtils http = new HttpUtils();  
        http.send(HttpRequest.HttpMethod.POST,  
                "https://pcs.baidu.com/rest/2.0/pcs/file",  
                params,  
                new RequestCallBack<String>() {  

                    @Override  
                    public void onStart() {  
                        resultText.setText("conn...");  
                    }  

                    @Override  
                    public void onLoading(long total, long current) {  
                        resultText.setText(current + "/" + total);  
                    }  

                    @Override  
                    public void onSuccess(String result) {  
                        resultText.setText("upload response:" + result);  
                    }  


                    @Override  
                    public void onFailure(HttpException error, String msg) {  
                        resultText.setText(msg);  
                    }  
                });  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章