Android实现文件下载进度显示功能_Android

和大家一起分享一下学习经验,如何实现Android文件下载进度显示功能,希望对广大初学者有帮助。
先上效果图:

  

上方的蓝色进度条,会根据文件下载量的百分比进行加载,中部的文本控件用来现在文件下载的百分比,最下方的ImageView用来展示下载好的文件,项目的目的就是动态向用户展示文件的下载量。

下面看代码实现:首先是布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="${relativePackage}.${activityClass}" >

  <ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:max="100" />

  <TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/progressBar"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="24dp"
    android:text="TextView" />

  <ImageView
    android:id="@+id/imageView"
    android:layout_marginTop="24dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_below="@+id/textView"
    android:contentDescription="@string/app_name"
    android:src="@drawable/ic_launcher" />

</RelativeLayout>

接下来的主Activity代码:

public class MainActivity extends Activity {

  ProgressBar pb;
  TextView tv;
  ImageView imageView;
  int fileSize;
  int downLoadFileSize;
  String fileEx,fileNa,filename;
  //用来接收线程发送来的文件下载量,进行UI界面的更新
  private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg)
    {//定义一个Handler,用于处理下载线程与UI间通讯
     if (!Thread.currentThread().isInterrupted())
     {
      switch (msg.what)
      {
       case 0:
        pb.setMax(fileSize);
       case 1:
        pb.setProgress(downLoadFileSize);
        int result = downLoadFileSize * 100 / fileSize;
        tv.setText(result + "%");
        break;
       case 2:
        Toast.makeText(MainActivity.this, "文件下载完成", Toast.LENGTH_SHORT).show();
        FileInputStream fis = null;
        try {
          fis = new FileInputStream(Environment.getExternalStorageDirectory() + File.separator + "/ceshi/" + filename);
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        }
        Bitmap bitmap = BitmapFactory.decodeStream(fis); ///把流转化为Bitmap图
        imageView.setImageBitmap(bitmap);
        break;  

       case -1:
        String error = msg.getData().getString("error");
        Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
        break;
      }
     }
     super.handleMessage(msg);
    }
   };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    pb=(ProgressBar)findViewById(R.id.progressBar);
    tv=(TextView)findViewById(R.id.textView);
    imageView = (ImageView) findViewById(R.id.imageView);
    tv.setText("0%");
    new Thread(){
      public void run(){
        try {
          //下载文件,参数:第一个URL,第二个存放路径
          down_file("http://cdnq.duitang.com/uploads/item/201406/15/20140615203435_ABQMa.jpeg", Environment.getExternalStorageDirectory() + File.separator + "/ceshi/");
        } catch (ClientProtocolException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
    }.start();  

  }  

  /**
   * 文件下载
   * @param url:文件的下载地址
   * @param path:文件保存到本地的地址
   * @throws IOException
   */
  public void down_file(String url,String path) throws IOException{
    //下载函数
    filename=url.substring(url.lastIndexOf("/") + 1);
    //获取文件名
    URL myURL = new URL(url);
    URLConnection conn = myURL.openConnection();
    conn.connect();
    InputStream is = conn.getInputStream();
    this.fileSize = conn.getContentLength();//根据响应获取文件大小
    if (this.fileSize <= 0) throw new RuntimeException("无法获知文件大小 ");
    if (is == null) throw new RuntimeException("stream is null");
    File file1 = new File(path);
    File file2 = new File(path+filename);
    if(!file1.exists()){
      file1.mkdirs();
    }
    if(!file2.exists()){
      file2.createNewFile();
    }
    FileOutputStream fos = new FileOutputStream(path+filename);
    //把数据存入路径+文件名
    byte buf[] = new byte[1024];
    downLoadFileSize = 0;
    sendMsg(0);
    do{
      //循环读取
      int numread = is.read(buf);
      if (numread == -1)
      {
       break;
      }
      fos.write(buf, 0, numread);
      downLoadFileSize += numread;  

      sendMsg(1);//更新进度条
    } while (true); 

    sendMsg(2);//通知下载完成  

    try{
      is.close();
    } catch (Exception ex) {
      Log.e("tag", "error: " + ex.getMessage(), ex);
    }  

  }  

  //在线程中向Handler发送文件的下载量,进行UI界面的更新
  private void sendMsg(int flag)
  {
    Message msg = new Message();
    msg.what = flag;
    handler.sendMessage(msg);
  }    

}

最后一定要注意的是:在AndroidManifest.xml文件中,添加访问网络的权限

<uses-permission android:name="android.permission.INTERNET"/>

到这里关于Android文件下载动态显示下载进度的内容就为大家分享完毕,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android文件下载
Android下载进度
android 进度条实现、js实现上传文件进度条、文件上传进度条实现、android搜索功能实现、android 登陆功能实现,以便于您获取更多的相关知识。

时间: 2024-09-14 04:32:27

Android实现文件下载进度显示功能_Android的相关文章

Android实现文件下载进度显示功能

和大家一起分享一下学习经验,如何实现Android文件下载进度显示功能,希望对广大初学者有帮助. 先上效果图: 上方的蓝色进度条,会根据文件下载量的百分比进行加载,中部的文本控件用来现在文件下载的百分比,最下方的ImageView用来展示下载好的文件,项目的目的就是动态向用户展示文件的下载量. 下面看代码实现:首先是布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm

Android中FTP上传、下载的功能实现(含进度)_Android

 Android中使用的FTP上传.下载,含有进度. 代码部分主要分为三个文件:MainActivity,FTP,ProgressInputStream 1. MainActivity package com.ftp; import java.io.File; import java.io.IOException; import java.util.LinkedList; import com.ftp.FTP.DeleteFileProgressListener; import com.ftp.

Android自定义荷载进度的两种方法_Android

本文将用两个方法来写类似汽车荷载的进度 用LinearLayout的addview方法加上for循环 用自定义控件的方法 先上截图 1. 用LinearLayout的addview方法加上for循环 1.1 processtest01.xml文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/a

Android带进度的圆形进度条_Android

我们还是用一个小例子来看看自定义View和自定义属性的使用,带大家来自己定义一个带进度的圆形进度条,我们还是先看一下效果吧 从上面可以看出,我们可以自定义圆环的颜色,圆环进度的颜色,是否显示进度的百分比,进度百分比的颜色,以及进度是实心还是空心等等,这样子是不是很多元化很方便呢?接下来我们就来教大家怎么来定义 1.在values下面新建一个attrs.xml,现在里面定义我们的属性,不同的属性对应不同的format,接下来我贴上我在自定义这个进度条所用到的属性 <?xml version="

Android 可拖动的seekbar自定义进度值_Android

最近接了个项目其中有需要要实现此功能:seekbar需要显示最左和最右值,进度要跟随进度块移动.下面通过此图给大家展示下效果,可能比文字描述要更清晰. 其实实现起来很简单,主要是思路.自定义控件的话也不难,之前我的博客也有专门介绍,这里就不再多说. 实现方案 这里是通过继承seekbar来自定义控件,这样的方式最快.主要难点在于进度的显示,其实我很的是最笨的方法,就是用了一个popwindow显示在进度条的上方,然后在移动滑块的时候实时的改变它显示的横坐标.看进度显示的核心代码: private

Android 七种进度条的样式_Android

当一个应用在后台执行时,前台界面就不会有什么信息,这时用户根本不知道程序是否在执行.执行进度如何.应用程序是否遇到错误终止等,这时需要使用进度条来提示用户后台程序执行的进度.Android系统提供了两大类进度条样式,长形进度条(progress-BarStyleHorizontal) 和圆形进度条(progressBarStyleLarge).进度条用处很多,比如,应用程序装载资源和网络连接时,可以提示用户稍等,这一类进度条只是代表应用程序中某一部分的执行情况,而整个应用程序执行情况呢,则可以通

Android自定义View基础开发之图片加载进度条_Android

学会了Paint,Canvas的基本用法之后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看. 按照惯例,先看效果图,再决定要不要往下看: 既然看到这里了,应该是想了解这个图片加载进度条了,我们先看具体用法,再看自定义View的实现: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.co

Android okhttputils现在进度显示实例代码_Android

OkHttpUtils是一款封装了okhttp的网络框架,支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,整合Gson,自动解析返回对象,支持Https和自签名证书,支持cookie自动管理,扩展了统一的上传管理和下载管理功能. //download the new app private void downLoadNewApp(NewVersion.XianzaishiRfBean version) { if (StringUtils.isEmpt

android系统文件下载二次请求

问题描述 android系统文件下载二次请求 应客户要求在通过手机访问系统主页时提供一个文件下载的功能.通过IOS产品.windows下所有浏览器下载都没有问题,但是通过android系统的手机访问下载时会出现两次请求的情况,有的品牌的android手机完全就无法下载,敢问哪位大虾遇到类似的问题,求解决之道. 解决方案 同样的问题,二次请求就不说了,问题是第一次铁定报错.而且还会有几率下载不成功,恼火啊 .....