怎样实现在android实现带进度条的上传效果

 我来答
wangwei7066
2015-08-10 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6693
采纳率:54%
帮助的人:1298万
展开全部
  实现在android实现带进度条的上传效果效果如图:

  


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


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);


        }


        returnnull;


    }


 


    @Override


    protectedvoidonProgressUpdate(Integer... progress){


        pd.setProgress((int) (progress[0]));


    }


 


    @Override


    protectedvoidonPostExecute(TypeUploadImageui) {


        pd.dismiss();


    }


}

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


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

小菜垚垚
2015-02-10 · TA获得超过463个赞
知道小有建树答主
回答量:277
采纳率:0%
帮助的人:183万
展开全部
progressbar可以实现啊,参数的值是你上传的数量的比例的值,这个要求你可以取到文件大小。具体实现可以参照以下链接的文章http://www.open-open.com/lib/view/open1345039676412.html
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式