当前位置:   article > 正文

Android利用网络编程HttpClient批量上传(两)AsyncTask+HttpClient监测进展情况,并上传...

asynctask监控文件上传进度

请尊重别人的劳动。转载请注明出处: 

Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听


 执行效果图:

AsyncTask+HttpClient并实现上传进度监听

        我曾在《Android网络编程之使用HttpClient批量上传文件》一文中介绍过怎样通过HttpClient实现多文件上传和server的接收。在上一篇主要使用Handler+HttpClient的方式实现文件上传。

这一篇将介绍使用AsyncTask+HttpClient实现文件上传并监听上传进度。

监控进度实现:

首先定义监听器接口。例如以下所看到的:

  1. /**
  2. * 进度监听器接口
  3. */
  4. public interface ProgressListener {
  5. public void transferred(longtransferedBytes);
  6. }

        实现监控进度的关键部分就在于记录已传输字节数,所以我们需重载FilterOutputStream。重写当中的关键方法,实现进度监听的功能。例如以下所看到的。本例中首先重载的是HttpEntityWrapper。顾名思义,就是将需发送的HttpEntity打包,以便计算总字节数。代码例如以下:

  1. package com.jph.ufh.utils;
  2. import java.io.FilterOutputStream;
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import org.apache.http.HttpEntity;
  6. import org.apache.http.entity.HttpEntityWrapper;
  7. /**
  8. * ProgressOutHttpEntity:输出流(OutputStream)时记录已发送字节数
  9. * @author JPH
  10. * Date:2014.11.03
  11. */
  12. public class ProgressOutHttpEntity extends HttpEntityWrapper {
  13. /**进度监听对象**/
  14. private final ProgressListener listener;
  15. public ProgressOutHttpEntity(final HttpEntity entity,final ProgressListener listener) {
  16. super(entity);
  17. this.listener = listener;
  18. }
  19. public static class CountingOutputStream extends FilterOutputStream {
  20. private final ProgressListener listener;
  21. private long transferred;
  22. CountingOutputStream(final OutputStream out,
  23. final ProgressListener listener) {
  24. super(out);
  25. this.listener = listener;
  26. this.transferred = 0;
  27. }
  28. @Override
  29. public void write(final byte[] b, final int off, final int len)
  30. throws IOException {
  31. out.write(b, off, len);
  32. this.transferred += len;
  33. this.listener.transferred(this.transferred);
  34. }
  35. @Override
  36. public void write(final int b) throws IOException {
  37. out.write(b);
  38. this.transferred++;
  39. this.listener.transferred(this.transferred);
  40. }
  41. }
  42. @Override
  43. public void writeTo(final OutputStream out) throws IOException {
  44. this.wrappedEntity.writeTo(out instanceof CountingOutputStream ?

out : new CountingOutputStream(out, this.listener)); } /** * 进度监听器接口 */ public interface ProgressListener { public void transferred(long transferedBytes); } }

 

最后就是使用上述实现的类和Httpclient进行上传并显示运行进度的功能,很easy,代码例如以下,使用AsyncTask异步上传。

  1. /**
  2. * 异步AsyncTask+HttpClient上传文件,支持多文件上传,并显示上传进度
  3. * @author JPH
  4. * Date:2014.10.09
  5. * last modified 2014.11.03
  6. */
  7. public class UploadUtilsAsync extends AsyncTask<String, Integer, String>{
  8. /**server路径**/
  9. private String url;
  10. /**上传的參数**/
  11. private Map<String,String>paramMap;
  12. /**要上传的文件**/
  13. private ArrayList<File>files;
  14. private long totalSize;
  15. private Context context;
  16. private ProgressDialog progressDialog;
  17. public UploadUtilsAsync(Context context,String url,Map<String, String>paramMap,ArrayList<File>files) {
  18. this.context=context;
  19. this.url=url;
  20. this.paramMap=paramMap;
  21. this.files=files;
  22. }
  23. @Override
  24. protected void onPreExecute() {//运行前的初始化
  25. // TODO Auto-generated method stub
  26. progressDialog=new ProgressDialog(context);
  27. progressDialog.setTitle("请稍等...");
  28. progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  29. progressDialog.setCancelable(true);
  30. progressDialog.show();
  31. super.onPreExecute();
  32. }
  33. @Override
  34. protected String doInBackground(String... params) {//运行任务
  35. // TODO Auto-generated method stub
  36. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  37. builder.setCharset(Charset.forName(HTTP.UTF_8));//设置请求的编码格式
  38. builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式
  39. int count=0;
  40. for (File file:files) {
  41. // FileBody fileBody = new FileBody(file);//把文件转换成流对象FileBody
  42. // builder.addPart("file"+count, fileBody);
  43. builder.addBinaryBody("file"+count, file);
  44. count++;
  45. }
  46. builder.addTextBody("method", paramMap.get("method"));//设置请求參数
  47. builder.addTextBody("fileTypes", paramMap.get("fileTypes"));//设置请求參数
  48. HttpEntity entity = builder.build();// 生成 HTTP POST 实体
  49. totalSize = entity.getContentLength();//获取上传文件的大小
  50. ProgressOutHttpEntity progressHttpEntity = new ProgressOutHttpEntity(
  51. entity, new ProgressListener() {
  52. @Override
  53. public void transferred(long transferedBytes) {
  54. publishProgress((int) (100 * transferedBytes / totalSize));//更新进度
  55. }
  56. });
  57. return uploadFile(url, progressHttpEntity);
  58. }
  59. @Override
  60. protected void onProgressUpdate(Integer... values) {//运行进度
  61. // TODO Auto-generated method stub
  62. Log.i("info", "values:"+values[0]);
  63. progressDialog.setProgress((int)values[0]);//更新进度条
  64. super.onProgressUpdate(values);
  65. }
  66. @Override
  67. protected void onPostExecute(String result) {//运行结果
  68. // TODO Auto-generated method stub
  69. Log.i("info", result);
  70. Toast.makeText(context, result, Toast.LENGTH_LONG).show();
  71. progressDialog.dismiss();
  72. super.onPostExecute(result);
  73. }
  74. /**
  75. * 向server上传文件
  76. * @param url
  77. * @param entity
  78. * @return
  79. */
  80. public String uploadFile(String url, ProgressOutHttpEntity entity) {
  81. HttpClient httpClient=new DefaultHttpClient();// 开启一个client HTTP 请求
  82. httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
  83. httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);// 设置连接超时时间
  84. HttpPost httpPost = new HttpPost(url);//创建 HTTP POST 请求
  85. httpPost.setEntity(entity);
  86. try {
  87. HttpResponse httpResponse = httpClient.execute(httpPost);
  88. if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  89. return "文件上传成功";
  90. }
  91. } catch (ClientProtocolException e) {
  92. e.printStackTrace();
  93. } catch (ConnectTimeoutException e) {
  94. e.printStackTrace();
  95. } catch (Exception e) {
  96. e.printStackTrace();
  97. } finally {
  98. if (httpClient != null && httpClient.getConnectionManager() != null) {
  99. httpClient.getConnectionManager().shutdown();
  100. }
  101. }
  102. return "文件上传失败";
  103. }
  104. }

        关于server端怎样接收:能够參考:《Android网络编程之使用HttpClient批量上传文件》,我在里面已经介绍的非常清楚了。

       假设你认为这篇博文对你有帮助的话,请为这篇博文点个赞吧!也能够关注fengyuzhengfan的博客,收看很多其它精彩!http://blog.csdn.net/fengyuzhengfan/   

版权声明:本文博客原创文章,博客,未经同意,不得转载。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/413609
推荐阅读
相关标签
  

闽ICP备14008679号