Android带进度条的文件上传示例(使用AsyncTask异步任务)
作者:yx0628 发布时间:2023-06-24 09:43:11
最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可。
demo运行截图:
AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p),在此方法中实现任务的执行工作,比如联网下载或上传。AsyncTask定义了三种泛型类型Params,Progress和Result。
1、Params 启动任务执行的输入参数,比如HTTP请求的URL,上传文件的路径等;
2、Progress 后台任务执行的百分比;
3、Result 后台执行任务的最终返回结果,比如String。
AsyncTask 的执行分为四个步骤,与前面定义的TaskListener类似。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用。
1、onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
2、doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
3、onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
4、onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
主进程中使用下面两行开始异步任务:
mTask = new MyTask();
mTask.execute(filePath, url);
doInBackground()函数中,params[0]和params[1]本别对应execute()的第一个和第二个变量。
private class MyTask extends AsyncTask<String, Integer, String>{
@Override
protected void onPostExecute(String result) {
//最终结果的显示
mTvProgress.setText(result);
}
@Override
protected void onPreExecute() {
//开始前的准备工作
mTvProgress.setText("loading...");
}
@Override
protected void onProgressUpdate(Integer... values) {
//显示进度
mPgBar.setProgress(values[0]);
mTvProgress.setText("loading..." + values[0] + "%");
}
@Override
protected String doInBackground(String... params) {
//这里params[0]和params[1]是execute传入的两个参数
String filePath = params[0];
String uploadUrl = params[1];
//下面即手机端上传文件的代码
String end = "\r\n";
String twoHyphens = "--";
String boundary = "******";
try {
URL url = new URL(uploadUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setConnectTimeout(6*1000);
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
httpURLConnection.setRequestProperty("Charset", "UTF-8");
httpURLConnection.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
DataOutputStream dos = new DataOutputStream(httpURLConnection
.getOutputStream());
dos.writeBytes(twoHyphens + boundary + end);
dos
.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""
+ filePath.substring(filePath.lastIndexOf("/") + 1)
+ "\"" + end);
dos.writeBytes(end);
//获取文件总大小
FileInputStream fis = new FileInputStream(filePath);
long total = fis.available();
byte[] buffer = new byte[8192]; // 8k
int count = 0;
int length = 0;
while ((count = fis.read(buffer)) != -1) {
dos.write(buffer, 0, count);
//获取进度,调用publishProgress()
length += count;
publishProgress((int) ((length / (float) total) * 100));
//这里是测试时为了演示进度,休眠500毫秒,正常应去掉
Thread.sleep(500);
}
fis.close();
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
dos.flush();
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
@SuppressWarnings("unused")
String result = br.readLine();
dos.close();
is.close();
return "上传成功";
}catch (Exception e) {
e.printStackTrace();
return "上传失败";
}
}
界面中只要一个进度条progressBar 和一个用于显示的TextView即可。


猜你喜欢
- jar:itext-4.2.1.jar在很多公文的落款处都需要绝对定位,所以记录此代码如下:PdfWriter writer = PdfWr
- 项目描述:这是一个基于SpringBoot+Vue框架开发的仿小米电子产品售卖商城系统。首先,这是一个前后端分离的项目,代码简洁规范,注释说
- 一,功能介绍本点单系统主要是基于SpringBoot框架和小程序开发的,主要是为当代人们的生活提供更便利、更高效的服务,也为营销者提供更好的
- AOP是Spring中的面向切面的编程,这里简单感受一下如何在xml文件中配置一个切面。如上图所示,配置一个切面的主要思路有以下几个步骤。1
- 相对于Swing来说,JavaFX在UI上改善了很多,不仅可以通过FXML来排版布局界面,同时也可以通过CSS样式表来美化UI。其实在开发J
- 有时候我们的应用里需要调用别人已经写好的应用(前提是用户手机上已经安装)。自己的应用A调用自己的应用B,有比较多的方法,例如,在被调用的应用
- springboots使用的版本是2.0.1,注意不同版本可能有差异,并不一定通用添加Mybatis的起步依赖:<!--mybatis
- 本文实现android系统照相机的调用来拍照项目的布局相当简单,只有一个Button:<RelativeLayout xmlns:an
- 当我们使用swagger,进行接口测试,怕接口不安全,担心暴露。可采用两种方式1.环境权限配置对swagger文档配置只在测试环境可访问,生
- C语言实现矩阵翻转 上下翻转与左右翻转实例代码:#include <stdio.h> void matrix (int m, i
- C# WinForm控件的拖动和缩放是个很有用的功能。实现起来其实很简单的,主要是设计控件的MouseDown、MouseLeave、Mou
- JAVA堆内存管理是影响性能主要因素之一。堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。
- C# XmlDocument操作XMLXML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语
- 近期,Google宣布Kotlin成为了Android一级开发语言。于是就刚刚简单的研究了一下,查资料的时候发现现成的资料还是很少的,于是决
- 微信平台开放后倒是挺火的,许多第三方应用都想试下,毕竟可以利用微信建立起来的关系链来拓展自己的应用还是挺不错的,可以节约很多在社交方面的开销
- 在 C 语言中,如果发生错误,上级函数要进行出错处理,层层上传,容易造成过多的出错处理代码,并且传递的效率比较低下。C++ 中的异常C++
- 一、广播机制概述通常情况下在学校的每个教室都会装有一个喇叭,这些喇叭是接入到学校广播室的。如果有重要通知,会发送一条广播来告知全校师生。为了
- BroadCast是什么BroadcastReceiver就是应用程序间的全局大喇叭,即通信的一个手段, 系统自己在很多时候都会发送广播,比
- 本文介绍了java 读写Parquet格式的数据,分享给大家,具体如下:import java.io.BufferedReader;impo
- 1. 什么是 HookHook 英文翻译过来就是「钩子」的意思,那我们在什么时候使用这个「钩子」呢?在 Android 操作系统中系统维护着