您的位置:首页 > 移动开发 > Android开发

Android应用开发之(你必须知道的“文件上传时显示进度的

2012-03-17 14:38 801 查看
进行大文件上传时,显示上传进度是很好的用户体验,可以有效的缓解用户急躁的情绪。今天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 / (float) totalSize) * 100));

在onProgressUpdate()实现上传进度的更新操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: