android 滑动杆布局,Android 大文件上传时处理上传进度问题小结

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

c05ac7a492747f8bc4bbf136d3518af7.png

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

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 / (float) totalSize) * 100));

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

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

时间: 2017-04-22

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值