Android 网络编程使用httpClient批量上传文件并监听进度

本文介绍了在Android中使用AsyncTask和HttpClient批量上传文件,并实现了上传进度的监听。通过定义ProgressListener接口和自定义ProgressOutHttpEntity类,监控文件传输的字节数,从而在上传过程中更新进度。
摘要由CSDN通过智能技术生成

运行效果图:
这里写图片描述
AsyncTask+HttpClient并实现上传进度监听

我曾在《 Android 网络编程之使用HttpClient 批量上传文件 》一文中介绍过如何通过 HttpClient 实现多文件上传和服务器的接收。在上一篇主要使用 Handler+HttpClient 的方式实现文件上传。这一篇将介绍使用 AsyncTask+HttpClient 实现文件上传并监听上传进度。

监控进度实现:

首先定义监听器接口。如下所示:

/**
* 进度监听器接口
*/
public interface ProgressListener {
public void transferred(longtransferedBytes);
}
实现监控进度的关键部分就在于记录已传输字节数,所以我们需重载 FilterOutputStream ,重写其中的关键方法,实现进度监听的功能,如下所示,本例中首先重载的是 HttpEntityWrapper ,顾名思义,就是将需发送的 HttpEntity 打包,以便计算总字节数,代码如下:

package com.jph.ufh.utils;

import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.http.HttpEntity;
import org.apache.http.entity.HttpEntityWrapper;

/**
* ProgressOutHttpEntity:输出流(OutputStream)时记录已发送字节数
* @author JPH
* Date:2014.11.03
*/
public class ProgressOutHttpEntity extends HttpEntityWrapper {
/进度监听对象/
private final ProgressListener listener;
public ProgressOutHttpEntity(final HttpEntity entity,final ProgressListener listener) {
super(entity);
this.listener = listener;
}

public static class CountingOutputStream extends FilterOutputStream {

private final ProgressListener listener;
private long transferred;

CountingOutputStream(final OutputStream out,
final ProgressListener listener) {
super(out);
this.listener = listener;
this.transferred = 0;
}

@Override
public void write(final byte[] b, final int off, final int len)
throws IOException {
out.write(b, off, len);
this.transferred += len;
this.listener.transferred(this.transferred);
}

@Override
public void write(final int b) throws IOException {
out.write(b);
this.transferred++;
this.listener.transferred(this.transferred);
}

}

@Override
public void writeTo(final OutputStream out) throws IOException {

this.wrappedEntity.writeTo(out instanceof CountingOutputStream ? out
: new CountingOutputStream(out, this.listener));
}
/**
* 进度监听器接口
*/
public interface ProgressListener {
public void transferred(long transferedBytes);
}
}
最后就是使用上述实现的类和Httpclient进行上传并显示进度的功能,非常简单,代码如下,使用AsyncTask异步上传。

/**
* 异步AsyncTask+HttpClient上传文件,支持多文件上传,并显示上传进度
* @author JPH
* Date:2014.10.09
* last modified 2014.11.03
*/
public class UploadUtilsAsync extends AsyncTask

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值