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 大文件上传时处理上传进度问题小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-09-06 18:26:18

Android 大文件上传时处理上传进度问题小结的相关文章

android大文件切割发送,接收后在合并显示

问题描述 android大文件切割发送,接收后在合并显示 android 大文件怎么实现分块传输,最后在合并显示.可以通过切割实现吗 解决方案 是文件断点续传吗...

android上传大文件亲测可用,上传200M个文件,不到3分钟

之前贴过个例子是android 入门学习笔记 上传大文件 这种的文件大小限制很严,一般30M以上就报错了.网上查了一下,还是推荐用Socket连接进行大文件上传. 今天测试了一下之前网上找的例子,通过Socket实现的android下大文件上传,服务器端用java接收.测试上传了个200M的文件,不到三分钟!还是可以接受的. 只是做了个简单的测试例子,还没有考虑到权限问题(手机上传资料到服务器端,应该需要做身份验证..) [html] view plaincopy connection.setC

jsp 上传 2g 大文件-如何用jsp网站上传2G以上大文件 在线等,急啊!!!

问题描述 如何用jsp网站上传2G以上大文件 在线等,急啊!!! 公司网站开发项目,要求上传2G以上的大文件包,目前尝试了用SmartUpload.cos进行基于流的上传方式,结果占用内存太大,目前最大能上传800M文件,离目标太远. 还尝试了用jsp连接ftp接口,上传,结果发现页面的file控件无法传递文件目录,只满足了本地上传,无法进行客户端ftp上传. 还在网上下载了插件,httpUploader的插件,结果发现不是上传有问题,就是要在线购买. 有哪位高手,能够帮帮忙,十分急,这个问题困

c# 上传大文件出现页面过期与上传无效的问题

问题描述 上传小文件没有问题,可以,但是如果大于4M就有问题了,Web.Config也配置过了,下面是代码与Web.ConfigpostedFile.SaveAs(System.Web.HttpContext.Current.Request.MapPath(aa)+fileName);<system.web><httpRuntimeexecutionTimeout="6000"maxRequestLength="2097151"useFullyQu

Android大图片裁剪终极解决方案(上:原理分析)

http://blog.csdn.net/floodingfire/article/details/8144604 约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已.     上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项目,就漏洞百出.     当时我用大众化的解决方案,暂时性的做了一个拍照截图的功能,似乎看起来很不错.问题随之而来,我用的是小米手机,在别的手机上都运行正常,小米这里却总是碰钉子.虽然

asp.net-C# Activx 上传分块上传大文件时能由Activx来完成合并分块的工作吗

问题描述 C# Activx 上传分块上传大文件时能由Activx来完成合并分块的工作吗 我用C#做activx上传大文件,采用http分块上传的思想,可是服务器端的人说,分块和拼接的工作都应由activx完成,上传完了给服务器一个完成的信号,服务器端只负责把拼接的文件编入数据库和移动到合适的位置,可是网上的好多资料都是拼接工作在服务器端完成,Activx真的能实现远程拼接工作吗,如果能,能否给一些资料,谢谢 解决方案 服务器端的人说的不对,ActiveX只需要分块就可以了.再拼接上显然是服务器

php上传大文件失败的解决办法

昨天一做php开发的网友问我为什么上传大文件总是失败,但是上传小文件就没有问题.作者一时半会儿也不知道什么原因,遂网上搜搜帮其分析原因,看到一篇很不错的关于php上传大文件失败的各种原因的总结以及各种解决办法的,于是转来与大家分享之.    下面分别是各种原因以及解决办法 (1)文件上传时存放文件的临时目录必须是开启的并且是 PHP 进程所有者用户可写的目录.如果未指定则 PHP 使用系统默认值. php.ini文件中upload_tmp_dir用来说明PHP上传的文件放置的临时目录,要想上传文

FireFox浏览器使用Javascript上传大文件_php实例

本程序是利用3.x的Firefox浏览器可以读取本地文件的特性,实现通过xmlHttPRequest上传大文件功能,并在可以上传过程中动态显示上传进度.略加修改,并与服务器端配合,可以实现断点续传等诸多功能.本例主要是研究FireFox的file-input节点的一些特性,其他客户端应用,如Flash.Sliverlight等,在实现客户端大文件上传时,在数据传输与服务器端存储等方面,与本例的思路基本一致.注意:文件体积似乎有临界点,但这个临界点是多少尚未确认.建议不要用此方法上传超过100M的

php上传大文件失败的原因及应对策略_php技巧

为什么上传大文件总是失败,但是上传小文件就没有问题.小编也不得其解,网上搜其原因,整理了一篇关于php上传大文件失败的原因和解决办法的文章,分享给大家. 下面分别是各种原因以及解决办法:第1种情况:文件上传时存放文件的临时目录必须是开启的并且是 PHP 进程所有者用户可写的目录.如果未指定则 PHP 使用系统默认值. php.ini文件中upload_tmp_dir用来说明PHP上传的文件放置的临时目录,要想上传文件,得保证服务器没有关闭临时文件并对该文件夹有写入的权限. 第2种情况:max_e