zoukankan      html  css  js  c++  java
  • Android应用开发之(你必须知道的“文件上传时显示进度的

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

            }

            returnnull;

        }

        @Override

        protectedvoidonProgressUpdate(Integer... progress){

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

        }

        @Override

        protectedvoidonPostExecute(TypeUploadImageui) {

            pd.dismiss();

        }

    }

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

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

  • 相关阅读:
    turtle绘制彩色螺旋线
    turtle 画一朵花
    Spark Streaming+Kafka提交offset实现有且仅有一次(exactly-once)
    利用Spark实现Oracle到Hive的历史数据同步
    spark-submit提交Spark Streamming+Kafka程序
    SparkStreaming+Kafka 实现统计基于缓存的实时uv
    SparkStreaming+Kafka 实现基于缓存的实时wordcount
    基于OGG的Oracle与Hadoop集群准实时同步介绍
    Spark Streaming连接Kafka入门教程
    spark连接hive(spark-shell和eclipse两种方式)
  • 原文地址:https://www.cnblogs.com/zhwl/p/2403205.html
Copyright © 2011-2022 走看看