Android-xUtils框架介绍(四)
今天介绍xUtils的最后一个模块——HttpUtils,拖了那么久,终于要结束了。另外,码字不易,如果大家有什么疑问和见解,欢迎大家留言讨论。HttpUtils是解决日常工作过程中繁杂的上传下载文件以及各种Get和post请求的必备工具类,通过这个类,开源非常方便关注接口的业务,不必再再写那么冗长的代码。下面全文都围绕着四个中心点去依次展开,分别是: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上传文件的时候,只要仿照下面的代码去码代码就快可以基本满足业务的需要了。
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); } });
转自:http://my.oschina.net/jack1900/blog/174439