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

 更新时间:2016年11月01日 10:30:31   作者:yx0628  
这篇文章主要介绍了Android带进度条的文件上传示例(使用AsyncTask异步任务),使用起来比较方便,将几个方法实现就行,感兴趣的小伙伴们可以参考一下。

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

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

相关文章

  • 详解Activity之singletast启动模式及如何使用intent传值

    详解Activity之singletast启动模式及如何使用intent传值

    在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中
    2015-11-11
  • android异步消息机制 从源码层面解析(2)

    android异步消息机制 从源码层面解析(2)

    这篇文章主要为大家详细介绍了android异步消息机制,从源码层面解析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Android Dispatchers.IO线程池深入刨析

    Android Dispatchers.IO线程池深入刨析

    这篇文章主要为大家介绍了Android Kotlin线程池Dispatchers.IO原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-08-08
  • Kotlin Channel处理多个数据组合的流

    Kotlin Channel处理多个数据组合的流

    最近项目中对 kotlin 的使用比较多。不得不说 kotlin 确实可以极大的提高 android 的开发效率,channel用于协程之间的通讯,使用send和receive往通道里写入或者读取数据,2个方法为非阻塞挂起函数,channel是热流,不管有没有订阅者都会发送
    2022-11-11
  • Android编程实现仿QQ发表说说,上传照片及弹出框效果【附demo源码下载】

    Android编程实现仿QQ发表说说,上传照片及弹出框效果【附demo源码下载】

    这篇文章主要介绍了Android编程实现仿QQ发表说说,上传照片及弹出框效果,涉及Android动画特效的相关实现技巧,并附带demo源码供读者下载参考,需要的朋友可以参考下
    2017-01-01
  • Android实现Window弹窗效果

    Android实现Window弹窗效果

    这篇文章主要为大家详细介绍了Android实现Window弹窗效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 如何利用Android仿微博正文链接交互效果

    如何利用Android仿微博正文链接交互效果

    最近在开发中遇到了各种坑,所以分享一下,希望能给大家贡献点经验,下面这篇文章主要给大家介绍了关于如何利用Android仿微博正文链接交互效果的相关资料,需要的朋友可以参考下
    2022-04-04
  • Android简单实现自定义流式布局的方法

    Android简单实现自定义流式布局的方法

    这篇文章主要介绍了Android简单实现自定义流式布局的方法,结合实例形式分析了Android流式布局的原理与实现技巧,需要的朋友可以参考下
    2016-07-07
  • Flutter弹性布局Flex水平排列Row垂直排列Column使用示例

    Flutter弹性布局Flex水平排列Row垂直排列Column使用示例

    这篇文章主要为大家介绍了Flutter弹性布局Flex水平排列Row垂直排列Column使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Android自定义View实现两种二维码的扫描效果

    Android自定义View实现两种二维码的扫描效果

    这篇文章主要为大家详细介绍了Android如何自定义View实现两种二维码的扫描效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01

最新评论