现在的位置: 首页 > 综合 > 正文

android 随手记 httpclient 异步上传

2018年09月15日 ⁄ 综合 ⁄ 共 4544字 ⁄ 字号 评论关闭

android使用异步http框架和第三方HttpClinet上传文件完整源码

首先我们先来看一下使用第三方HttpClinet的实现方式

这种实现方式需要用到一下3个jar包

commons-fileupload-1.2.1.jar  、  commons-io-1.4.jar  、  commons-httpclient-3.0.1.jar 。

这些jar已经包含在源码工程里边了

关于使用步骤我不多说,代码里边的注释已经写明

  1. public void uploadByHttpClient(View view) {  
  2.         String path = this.et_path.getText().toString().trim();  
  3.         final String url = "http://110.65.99.66:8080/uploadfileServer/UploadFileServlet";  
  4.         final File file = new File(path);  
  5.         // 先判断文件是否存在  
  6.         if (file.exists() && file.length() > 0) {  
  7.             // 网络访问为耗时操作,应该放在子线程中执行  
  8.             new Thread() {  
  9.                 public void run() {  
  10.   
  11.                     // 1. 创建第三方HttpClient对象  
  12.                     HttpClient client = new HttpClient();  
  13.   
  14.                     // 2. 创建POST请求对象  
  15.                     PostMethod post = new PostMethod(url);  
  16.   
  17.                     // 3. 设置请求体内容  
  18.                     try {  
  19.                         // 参数体  
  20.                         Part[] ps = { new FilePart("file", file) };  
  21.                         post.setRequestEntity(new MultipartRequestEntity(ps,  
  22.                                 post.getParams()));  
  23.   
  24.                         // 4. 获取连接器管理对象  
  25.                         HttpConnectionManager manager = client  
  26.                                 .getHttpConnectionManager();  
  27.   
  28.                         // 5. 设置参数提交的等待时间  
  29.                         manager.getParams().setConnectionTimeout(10000);  
  30.   
  31.                         // 6. 执行PostMethod方法  
  32.                         client.executeMethod(post);  
  33.   
  34.                         // 7. 程序执行到这里,说明成功  
  35.                         runOnUiThread(new Runnable() {  
  36.   
  37.                             @Override  
  38.                             public void run() {  
  39.                                 Toast.makeText(MainActivity.this"上传成功"0)  
  40.                                         .show();  
  41.                             }  
  42.                         });  
  43.   
  44.                     } catch (Exception e) {  
  45.                         e.printStackTrace();  
  46.                         runOnUiThread(new Runnable() {  
  47.   
  48.                             @Override  
  49.                             public void run() {  
  50.                                 Toast.makeText(MainActivity.this"上传失败"0)  
  51.                                         .show();  
  52.                             }  
  53.                         });  
  54.                     }  
  55.                 };  
  56.             }.start();  
  57.         } else {  
  58.             Toast.makeText(this"文件不存在!"0).show();  
  59.         }  
  60.     }  

我们再来看看使用异步http框架的实现方式

安卓异步http框架是一个非常精巧的,用于andorid网络访问的开源框架。它简化了android自带的HttpClient的操作步骤。使用起来相对于上边的实现方式就简单多了

安卓异步框架源码下载

我们先要把下载下来的源码中library/src目录下的包给拷到安卓工程下的src目录

我们看一下核心实现代码

  1. public void uploadByAsyncHttpClient(View view) {  
  2.         String path = this.et_path.getText().toString().trim();  
  3.         final String url = "http://110.65.99.66:8080/uploadfileServer/UploadFileServlet";  
  4.         final File file = new File(path);  
  5.         // 先判断文件是否存在  
  6.         if (file.exists() && file.length() > 0) {  
  7.   
  8.             // 1. 创建AsyncHttpClient对象  
  9.             AsyncHttpClient client = new AsyncHttpClient();  
  10.   
  11.             // 2.设置参数体  
  12.             RequestParams params = new RequestParams();  
  13.             try {  
  14.                 // 其实这里的异常不可能出现,因为上边已经做了判断  
  15.                 params.put("profile_picture", file);  
  16.             } catch (FileNotFoundException e) {  
  17.                 // TODO Auto-generated catch block  
  18.                 e.printStackTrace();  
  19.             }  
  20.   
  21.             // 3.上传文件  
  22.             client.post(url, params, new AsyncHttpResponseHandler() {  
  23.                 // 上传成功时回调的方法  
  24.                 @Override  
  25.                 public void onSuccess(int statusCode, Header[] headers,  
  26.                         byte[] responseBody) {  
  27.                     Toast.makeText(MainActivity.this"上传成功!"0).show();  
  28.                 }  
  29.   
  30.                 // 上传失败时回调的方法  
  31.                 @Override  
  32.                 public void onFailure(int statusCode, Header[] headers,  
  33.                         byte[] responseBody, Throwable error) {  
  34.                     Toast.makeText(MainActivity.this"上传失败!错误码:" + statusCode,  
  35.                             0).show();  
  36.                 }  
  37.   
  38.             });  
  39.         } else {  
  40.             Toast.makeText(this"文件不存在!"0).show();  
  41.         }  
  42.     }  

我们来对比一下上边两种实现方式

1.从实现步骤来看,第一种用了7步,第二种只用了3步,操作步骤大大简化

2.第一种方式需要将网络访问的代码放到子线程中去,否则在4.0以上的系统上运行会抛出android.os.NetworkOnMainThreadException,而第二种不用去考虑这个异常

3.因为将网络访问的代码放到了子线程中去,所以子线程中如果有UI的更新,需要去调用Activity的runOnUiThread()方法

经过对比,第二种方式的优越性就凸显出来了。所以安卓的文件上传建议使用异步http框架来实现。

抱歉!评论已关闭.