进行大文件上传时,显示上传进度是很好的用户体验,可以有效的缓解用户急躁的情绪。今天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 {    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 / (floattotalSize) * 100));

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



更多相关文章

  1. 分享:android图片浏览器—类微信朋友圈相片浏览【android代码下载
  2. Android(安卓)Studio 快捷方式
  3. Android开发之Toast全接触
  4. Android(安卓)程式开发:(一)详解Activity —— 1.4显示“普通”对话
  5. android SystemUI显示问题。
  6. node.js+android(使用HttpURLConnection和HttpClient)实现文件上
  7. 【移动开发】Android相机、相册获取图片显示并保存到SD卡
  8. 简单实现Android文件上传
  9. Android(安卓)创建AlertDislog时要小心哦

随机推荐

  1. android View的scrollTo,scrollBy方法详
  2. Android对话框Dialog 的一点小问题
  3. 关于用代码实现android设备的重启
  4. Android(安卓)log保存到SDCARD的方法
  5. Android进程通信之Messenger和AIDL使用详
  6. Android中的 Thread + Handler 线程简单
  7. android monkey app乱点测试
  8. 右侧滑出式提示框改良
  9. Android(安卓)存储:SD卡剩余空间的检测
  10. Android(安卓)XML文件中引用资源的方法