博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android文件下载之进度检测
阅读量:5815 次
发布时间:2019-06-18

本文共 4681 字,大约阅读时间需要 15 分钟。

  近期因为项目的需要,研究了一下Android文件下载进度显示的功能实现,接下来就和大家一起分享学习一下,希望对广大初学者有帮助。

  先上效果图:

  

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

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

  接下来的主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文件中,添加访问网络的权限

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

转载地址:http://mmmbx.baihongyu.com/

你可能感兴趣的文章
nginx 域名跳转一例~~~(rewrite、proxy)
查看>>
linux用户家目录无损迁移到独立硬盘
查看>>
文件查找
查看>>
shell编程前言(一)
查看>>
5、centos7.*配置yum的EPEL源及其它源
查看>>
JSON前后台简单操作
查看>>
shell中一些常见的文件操作符
查看>>
CentOS 7 装vim遇到的问题和解决方法
查看>>
JavaScript基础教程1-20160612
查看>>
使用第三方类、库需要注意的正则类RegexKitLite的使用
查看>>
iOS \U7ea2 乱码 转换
查看>>
FCN图像分割
查看>>
ios xmpp demo
查看>>
python matplotlib 中文显示参数设置
查看>>
数据库事务隔离级别
查看>>
os模块大全详情
查看>>
【ros】Create a ROS package:package dependencies报错
查看>>
kali linux 更新问题
查看>>
HDU1576 A/B【扩展欧几里得算法】
查看>>
廖雪峰javascript教程学习记录
查看>>