这里有新鲜出炉的精品教程,程序狗速度看过来!
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
进行大文件上传时,显示上传进度给用户带来极好的用户体验度,今天小编给大家分享 Android 大文件上传时处理上传进度问题小结,需要的的朋友参考下吧
进行大文件上传时,显示上传进度是很好的用户体验,可以有效的缓解用户急躁的情绪。今天 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);
- }
- 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 大文件上传时处理上传进度问题小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 PHPERZ 网站的支持!
(adsbygoogle = window.adsbygoogle || []).push({});
来源: http://www.phperz.com/article/17/0626/333721.html