首页 > 系统 > Android > 正文

Android 大文件上传时处理上传进度问题小结

2019-12-12 03:01:13
字体:
来源:转载
供稿:网友

进行大文件上传时,显示上传进度是很好的用户体验,可以有效的缓解用户急躁的情绪。今天Android IT 分享一个好的显示上传进度的解决方案。

我们用到以下两个类就可实现带进度条的文件上传:

1、CustomMultiPartEntity extends MultipartEntity,

2、HttpMultipartPost extends AsyncTask

import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntity;  public class CustomMultipartEntity extends MultipartEntity {   private final ProgressListener listener;   public CustomMultipartEntity(final ProgressListener listener) {     super();     this.listener = listener;   }   public CustomMultipartEntity(final HttpMultipartMode mode, final ProgressListener listener) {     super(mode);     this.listener = listener;   }   public CustomMultipartEntity(HttpMultipartMode mode, final String boundary,       final Charset charset, final ProgressListener listener) {     super(mode, boundary, charset);     this.listener = listener;   }   @Override   public void writeTo(final OutputStream outstream) throws IOException {     super.writeTo(new CountingOutputStream(outstream, this.listener));   }   public static interface ProgressListener {     void transferred(long num);   }   public static class CountingOutputStream extends FilterOutputStream {     private final ProgressListener listener;     private long transferred;     public CountingOutputStream(final OutputStream out, final ProgressListener listener) {       super(out);       this.listener = listener;       this.transferred = 0;     }     public void write(byte[] b, int off, int len) throws IOException {       out.write(b, off, len);       this.transferred += len;       this.listener.transferred(this.transferred);     }     public void write(int b) throws IOException {       out.write(b);       this.transferred++;       this.listener.transferred(this.transferred);     }   } } 

该类计算写入的字节数,我们需要在实现ProgressListener中的trasnfered()方法,更行进度条 

public class HttpMultipartPost extends AsyncTask<HttpResponse, Integer, TypeUploadImage> {   ProgressDialogpd;   longtotalSize;   @Override   protectedvoidonPreExecute(){     pd= newProgressDialog(this);     pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);     pd.setMessage("Uploading Picture...");     pd.setCancelable(false);     pd.show();   }    @Override   protectedTypeUploadImagedoInBackground(HttpResponse... arg0) {     HttpClienthttpClient = newDefaultHttpClient();     HttpContexthttpContext = newBasicHttpContext();     HttpPosthttpPost = newHttpPost("http://herpderp.com/UploadImage.php");     try{       CustomMultipartEntitymultipartContent = newCustomMultipartEntity(           newProgressListener() {             @Override             public void transferred(longnum){               publishProgress((int) ((num / (float) totalSize) * 100));             }           });       // We use FileBody to transfer an image       multipartContent.addPart("uploaded_file", newFileBody(           newFile(m_userSelectedImagePath)));       totalSize= multipartContent.getContentLength();       // Send it       httpPost.setEntity(multipartContent);       HttpResponseresponse = httpClient.execute(httpPost, httpContext);       String serverResponse = EntityUtils.toString(response.getEntity());       ResponseFactoryrp = newResponseFactory(serverResponse);       return(TypeImage) rp.getData();     } catch(Exception e) {       System.out.println(e);     }     return null;   }   @Override   protectedvoidonProgressUpdate(Integer... progress){     pd.setProgress((int) (progress[0]));   }   @Override   protectedvoidonPostExecute(TypeUploadImageui) {     pd.dismiss();   } } 

在 transferred()函数中调用publishProgress((int) ((num / (float) totalSize) * 100));

在onProgressUpdate()实现上传进度的更新操作

以上所述是小编给大家介绍的Android 大文件上传时处理上传进度问题小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表