Android带进度条的文件上传示例(使用AsyncTask异步任务)_Android

最近项目中要做一个带进度条的上传文件的功能,学习了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即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索asynctask进度条
asynctask异步任务
js异步上传显示进度条、asynctask进度条、asynctask更新进度条、asynctask异步任务、tornado 异步示例,以便于您获取更多的相关知识。

时间: 2024-11-03 22:38:03

Android带进度条的文件上传示例(使用AsyncTask异步任务)_Android的相关文章

Android带进度条的文件上传示例(使用AsyncTask异步任务)

最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可. demo运行截图: AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p),在此方法中实现任务的执行工作,比如联网下载或上传.AsyncTask定义了三种泛型类型Params,Progress和Result. 1.Params 启动任务执行的输入参数,比

QFaces1.2 --Ajax方式,带进度条的文件上传组件FileUpload(for JSF)

这是QFaces的第4个组件,Ajax方式带进度条的文件上传组件,我希望每一个重要组件都提升一个版本, 呵呵!这个版本同时修正了ie6下的ajax兼容问题.在介绍完这个组件之后,打算介绍一下如何利用QFaces自 定义自己的Ajax组件,希望这个增强框架能对喜欢JSF的人有一些帮助.后面版本的升级可能就不会这么快, 或者考虑兼容一下facelets,并修正一些可能出现的错误,还有开源计划,然后继续维护并增加一些比较常 用与实用的组件,关注一下JSF2.0的发展等等. 好了,下面介绍一下QFace

ASP.NET实现带进度条的文件上传(多种风格)

文件上传 带进度条 多种风格 非常漂亮!

android实现带进度条的文件上传

MainActivity.java package com.example.upload; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Pro

jQuery.Uploadify插件实现带进度条的批量上传功能_jquery

本文实例讲述了jQuery.Uploadify插件实现带进度条的批量上传功能.分享给大家供大家参考,具体如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="UpLoad.aspx.cs" Inherits="UploadifyDemo_UpLoad" %> <html xmlns="http://www.w3.org/1999/xh

jquery插件uploadify实现带进度条的文件批量上传_jquery

有时项目中需要一个文件批量上传功能时,个人认为uploadify是快速简便的解决方案,分享给大家供大家参考,具体如下 先上效果图: 具体代码如下: 在页面中如下 完整页面代码 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <

ASP上传的进度条实时反映上传情况

asp中使用组件上传时,有点麻烦就是不知道上传进度是多少,虽然有的提供了上传进度条,例如abcupload(下载地址:http://www.websupergoo.com)已经提供了显示当前上传状态的方法,里面就有专门的实例(在安装目录的Examples下面的progressupload.htm),它是提交数据的同时弹出一个反映进度的页面(progressbar.asp) 然后通过这个页面自刷新来每隔一点时间获取当时的上传状态,然后把它们显示出来,但是用页面自刷新的方法效率比较低,不不好调节刷新

上传的进度条 实时反映上传情况

asp中使用组件上传时,有点麻烦就是不知道上传进度是多少,虽然有的提供了上传进度条,例如abcupload(下载地址:http://www.websupergoo.com)已经提供了显示当前上传状态的方法,里面就有专门的实例(在安装目录的Examples下面的progressupload.htm),它是提交数据的同时弹出一个反映进度的页面(progressbar.asp),然后通过这个页面自刷新来每隔一点时间获取当时的上传状态,然后把它们显示出来,但是用页面自刷新的方法效率比较低,不不好调节刷新

android文件上传示例分享(android图片上传)_Android

主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中. 主Activity 复制代码 代码如下: package com.guotop.elearn.activity.app.yunpan.activity; import java.io.File;import java.io.FileNotFoundException;import java.io.IOException; import android.app.Activity;impor