文档章节

Android带进度条的文件上传,使用AsyncTask异步任务

o
 osc_4nmshwhm
发布于 2018/08/06 16:34
字数 872
阅读 4
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

      最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可。

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即可。或者自己写的控件均可。

转: https://blog.csdn.net/yx0628/article/details/10054851

o
粉丝 1
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.3K
3
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
708
1
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.9K
1
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
7.7K
8
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1

没有更多内容

加载失败,请刷新页面

加载更多

生成0到9之间的随机整数 - Generate random integers between 0 and 9

问题: How can I generate random integers between 0 and 9 (inclusive) in Python? 如何在Python中生成0到9(含)之间的随机整数? For example, 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9......

法国红酒甜
5分钟前
0
0
《Java8实战》笔记(01):为什么要关心Java8

为什么要关心 Java 8 Java 8 新特性: Stream API 向方法传递代码的技巧 接口中的默认方法 助记: //Java8主要有哪些新特性?//1.Stream API 2.接口的默认实现 3.方法晋升一级公民invent...

巨輪
5分钟前
0
0
Spring Boot 教程 - MyBatis-Plus

1. Mybatis-Plus简介 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 为什么说Mybatis-Plus是Mybatis的增强? myba...

Butterfly-Tri
11分钟前
0
0
SpringBoot2.0+Shiro+MyBatisPlus权限管理系统

项目描述 Hi,大家好,今天分享的项目是《SpringBoot+Shiro权限管理系统》,这是一个SpringBoot+Layui后台管理系统,使用Shiro安全框架,加入访问权限,对不同角色有不同的访问权限,其他管理...

ericxu1116
27分钟前
11
0
详解IO多路复用和其三种模式——select/poll/epoll

前言 我们平常采用的多进程方式实现的服务器端,即一次创建多个工作子进程来给客户端提供服务。其实这种方式是存在问题的。 可以打个比方:如果我们先前创建的几个进程承载不了目前快速发展的...

ls_cherish
29分钟前
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部