Android文件下载进度条的实现代码

 更新时间:2013年01月21日 11:28:48   作者:  
我们今天开始学习的是下载进度的实现。今天的这段代码是网上找的,自己做了些小改,通过模拟器测试。文件下载进度条控制(就是为了高清壁纸加个进度条),自己研究了好久,但是进度条只能显示缓存写入文件的进度,不能显示下载进度。找了好久,终于找到一段用的代码,所以记录下来,大家分享
main.xml:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  android:id="@+id/tv"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text=""
    />
<ProgressBar android:id="@+id/down_pb"
 android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:max="100"
    style="?android:attr/progressBarStyleHorizontal" mce_style="?android:attr/progressBarStyleHorizontal"
/>
</LinearLayout>

main.java:
复制代码 代码如下:

package com.pocketdigi.download;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.client.ClientProtocolException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class main extends Activity {
    /** Called when the activity is first created. */
 ProgressBar pb;
 TextView tv;
 int   fileSize;
 int   downLoadFileSize;
 String fileEx,fileNa,filename;
 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(main.this, "文件下载完成", 1).show();
             break;
           case -1:
             String error = msg.getData().getString("error");
             Toast.makeText(main.this, error, 1).show();
             break;
         }
       }
       super.handleMessage(msg);
     }
   };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pb=(ProgressBar)findViewById(R.id.down_pb);
        tv=(TextView)findViewById(R.id.tv);
        new Thread(){
         public void run(){
          try {
     down_file("http://wallpaper.pocketdigi.com/upload/1/bigImage/1284565196.jpg","/sdcard/");
     //下载文件,参数:第一个URL,第二个存放路径
    } catch (ClientProtocolException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
         }
        }.start();
    }
    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");
     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);
       }
    }
 private void sendMsg(int flag)
 {
     Message msg = new Message();
     msg.what = flag;
     handler.sendMessage(msg);
 } 
}

大家看了以后就应该明白了,上面写的是用一个循环来完成的这些事情,byte buf[] = new byte[1024];这句话中大家一定要写1024,这个可不能改变呀。sendMsg(0);这句的括号里写的是0,这个也要记得,是0而不是1.

相关文章

  • Android模拟美团客户端进度提示框

    Android模拟美团客户端进度提示框

    这篇文章主要为大家详细介绍了Android模拟美团客户端进度提示框的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-09-09
  • Android App页面滑动标题栏颜色渐变详解

    Android App页面滑动标题栏颜色渐变详解

    这篇文章主要为大家详细介绍了Android App页面滑动标题栏颜色渐变,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Android系统的五种数据存储形式实例(一)

    Android系统的五种数据存储形式实例(一)

    Android系统有五种数据存储形式,分别是文件存储、SP存储、数据库存储、contentprovider 内容提供者、网络存储。本篇文章详解的介绍了每种数据存储的用法,有兴趣的可以了解一下。
    2016-12-12
  • android顶部(toolbar)搜索框实现代码

    android顶部(toolbar)搜索框实现代码

    这篇文章主要介绍了android顶部(toolbar)搜索框实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • AndroidStudio升级4.1后启动失败Plugin问题解决

    AndroidStudio升级4.1后启动失败Plugin问题解决

    这篇文章主要介绍了AndroidStudio升级4.1后启动失败Plugin问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Android通过startService播放背景音乐

    Android通过startService播放背景音乐

    这篇文章主要介绍了Android通过startService播放背景音乐简单示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Android自定义view实现雪花特效实例代码

    Android自定义view实现雪花特效实例代码

    实现雪花的效果其实也可以通过自定义View的方式来实现的,而且操作上也相对简单一些,下面这篇文章主要给大家介绍了关于Android自定义view实现雪花特效的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Android三种常见的图片压缩方式

    Android三种常见的图片压缩方式

    在开发中,我们经常有这样一种需求,从相册选择图片,上传到服务器。随着手机像素的不断提升,照片也是小一点的3,4兆,大一点的多大10多兆。如果直接上传原图,会增大服务器压力,所以,在上传之前对图片压缩就显得很必要了。
    2021-05-05
  • Android图片或拍照选择图片功能实例代码

    Android图片或拍照选择图片功能实例代码

    这篇文章主要给大家介绍了关于Android图片或拍照选择图片功能的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • flutter 屏幕尺寸适配和字体大小适配的实现

    flutter 屏幕尺寸适配和字体大小适配的实现

    这篇文章主要介绍了flutter 屏幕尺寸适配和字体大小适配的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论