又拍云官方demo是没有上传资源带进度条的,所以想要这个功能得自己写.
这里我是用AsyncTask异步处理来做的,
1,onPreExecute 在方法里做进度条初始化.
2, doInBackground 上传资源,代码如下.
3 , onProgressUpdate 做进度条实时更新操作.
4 , onPostExecute 做通知任务完成,更新进度条.
//SimpleMultipartEntity 是一个implements HttpEntity接口的类
SimpleMultipartEntity sme = new SimpleMultipartEntity();
//传入相应所需参数
sme.addPart("policy", policy);
sme.addPart("signature", signature);
sme.addPart("file", "test", inputStream);
tatol = sme.getContentLength();
//重点就算下面这个类监听
ProgressOutHttpEntity progressHttpEntity = new ProgressOutHttpEntity(
sme, new ProgressListener() {
@Override
public void transferred(long transferedBytes) {
publishProgress((int) (100 * transferedBytes / tatol));
}
});
httppost.setEntity(progressHttpEntity);
HttpResponse response = httpclient.execute(httppost);
SimpleMultipartEntity在upyun demo里都有,但是你需要重写一个HttpEntity的writeTo方法:
@Override
public void writeTo(final OutputStream outstream) throws IOException {
byte[] bytes = out.toByteArray();
for (int i = 0; i < bytes.length; i++) {
outstream.write(bytes[i]);
}
}
当你传入资源时就会调用此方法写入流。但是你还需要一个监听:ProgressOutHttpEntity
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.http.HttpEntity;
import org.apache.http.entity.HttpEntityWrapper;
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);
}
}