博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android应用开发之(你必须知道的“文件上传时显示进度的
阅读量:6414 次
发布时间:2019-06-23

本文共 3338 字,大约阅读时间需要 11 分钟。

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

 

        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()实现上传进度的更新操作

转载地址:http://fqbra.baihongyu.com/

你可能感兴趣的文章
关于监控工具的主动发起性能测试
查看>>
我的友情链接
查看>>
OpenSSL学习(十六):基础-指令rand
查看>>
KeyMob致力于打造国内领先的移动广告平台
查看>>
路由选路原则
查看>>
jvm 学习(一)
查看>>
JavaScript简介
查看>>
SQL Server附加数据库拒绝访问解决方法汇总
查看>>
SM2算法原理及实现
查看>>
RHCA教材翻译计划
查看>>
js-小括号在不同场合下的作用
查看>>
我的友情链接
查看>>
kvm中虚拟机的硬盘扩容
查看>>
Android (Launch Mode) 四种启动模式
查看>>
透视学理论(二)
查看>>
Dubbo/HSF在Service Mesh下的思考和方案
查看>>
Django form表单
查看>>
CTYL-9.14(tomcat端口与阿里云安全组,域名与tomcat配置,域名与反向代理)
查看>>
Java 多线程相关问题记录
查看>>
LNMP架构介绍、MySQL安装、PHP安装、 Nginx介绍
查看>>