天天看點

xUtils架構介紹之HttpUtils的使用

今天剛好用到HttpUtils上傳多個檔案,就順便轉了某大神寫的部落格與大家分享。

本文轉載自:http://my.oschina.net/jack1900/blog/174439

下面分别介紹:HttpGet請求,HttpPost請求,下載下傳檔案和上傳檔案。

    HttpGet請求。相信從事Android網絡應用的開發的同學對這個一定不會陌生,長期的開發會讓大家積累下一個可以複用的工具類。而xUtils就是幫助了我們把那些工具類給抽象整合成一個更具擴充性的幫助類。比如HtttpGet請求,這裡隻簡要介紹下關鍵的應用方法,具體的細節還請大家自己去下載下傳xUtils的源碼去研究研究了,我們介紹的足夠應用到我們的應用開發中去了。通常的HttpGet請求會把一系列的請求參數挂在請求位址的後面,拖出一節長長的尾巴,十分的惹人厭,這裡可以通過像HttpPost請求的參數那樣組成一個類似BasicNameValuePair的對象直接封裝到請求方法中去,省去拼接url的麻煩,同時也可以設定逾時時間。另外請求的方法中提供了一個回調類,這個類中有處理不同請求結果的回調方法,比如說請求過程中的回調,請求成功的回調以及請求出現錯誤時的回調。下面直接上代碼看下。

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的幾乎可以說是一模一樣,一樣提供了各種對應不同結果的回調方法,大家自己看下面的代碼就曉得了,真是一目了然。

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,可以通過簡單的幾個參數來實作下載下傳,甚至斷點下載下傳的功能。上代碼。

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上傳檔案的時候,隻要仿照下面的代碼去碼代碼就快可以基本滿足業務的需要了。

addBodyParameterRequestParams 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"));
        //這裡我補充一下,如果要多檔案上傳,那麼可以多次進行addBoyParameter("file",new File("..."));            
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);
                    }
                });