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文件下载动态显示下载进度的小demo就为大家分享完毕,希望对大家的学习有所帮助。
Android文件下载之进度检测的更多相关文章
- Android中使用AsyncTask实现文件下载以及进度更新提示
		
Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和 ...
 - 利用Android Studio、MAT对Android进行内存泄漏检测
		
利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...
 - Android View 之进度条+拖动条+星级评论条....
		
PS:将来的你会感谢现在奋斗的自己.... 学习内容: 1.进度条 2.拖动条 3.星级评论条 1.进度条... 进图条这东西想必大家是很熟悉的...为了使用户不会觉得应用程序死掉了,因此 ...
 - 10.Android之ProgressDialog进度对话框学习
		
APP应用中经常会下载某些东西,这里面有涉及到进度对话框,今天来学习下. 首先,布局里放进两个按钮,点击一个显示条形进度条,另一个显示圆形进度条.代码如下: <?xml version=&quo ...
 - Android 自学之进度条ProgressBar
		
进度条(ProgressBar)也是UI界面中的一种非常使用的组件,通常用于向用户显示某个耗时完成的百分比.因此进度条可以动态的显示进度,因此避免长时间地执行某个耗时操作时,让用户感觉程序失去了响应, ...
 - 【转】24. android dialog ——ProgressDialog 进度条对话框详解
		
原文网址:http://blog.csdn.net/jamesliulyc/article/details/6375598 首先在onCreateDialog方法里创建一个ProgressDialog ...
 - Android内存泄漏的检测流程、捕捉以及分析
		
https://blog.csdn.net/qq_20280683/article/details/77964208 Android内存泄漏的检测流程.捕捉以及分析 简述: 一个APP的性能,重度关乎 ...
 - python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)
		
先来回顾一下昨天的内容 黏包现象粘包现象的成因 : tcp协议的特点 面向流的 为了保证可靠传输 所以有很多优化的机制 无边界 所有在连接建立的基础上传递的数据之间没有界限 收发消息很有可能不完全相 ...
 - Android——菜单和进度条
		
xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...
 
随机推荐
- Android开发  SQLite数据库应用笔记(一)
			
注意: 1.public Cursor rawQuery(String sql, String[] selectionArgs) Cursor游标是查询后返回的结果集合,游标的意思是指向集合中的某行. ...
 - haahah
			
#DB ``` import os basedir = os.path.abspath(os.path.dirname(__file__)) SQLALCHEMY_DATABASE_URI = ' ...
 - WebRTC通信流程
			
WebRTC是HTML5支持的重要特性之一,有了它,不再需要借助音视频相关的客户端,直接通过浏览器的Web页面就可以实现音视频对聊功能.而且WebRTC项目是开源的,我们可以借助WebRTC源码快速构 ...
 - sass sourcemap详细使用
			
新发布的Sass 3.3版本,将Source Maps正式纳入了Sass中.这也成为Sass新版本的一大亮点,一大新功能.让广大Sass爱好者可以直接在浏览器中更容易调试自己的代码和Debug相关操作 ...
 - python小程序
			
使用python实现在crt中捕捉出现的异常信息,并统计出现的次数: #$language = "Python" #$interface = "1.0" def ...
 - Torch7学习笔记(一)CmdLine
			
该类主要为了提供一种方便解析参数的框架,对于每个实验尤其是神经网络中要调参数上.同时还可以把输出重定向到log文件中. 一般用法: cmd = torch.CmdLine() cmd:text() c ...
 - Ubuntu Java 环境变量
			
方法1:修改/etc/profile 文件所有用户的 shell都有权使用这些环境变量<1>在 shell终端执行命令:vi /etc/profile<2>在 profile文 ...
 - Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
			
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
 - Codeforces Round #361 (Div. 2)  B
			
B - Mike and Shortcuts Description Recently, Mike was very busy with studying for exams and contests ...
 - java排序学习笔记
			
前面写了js的排序实现,总得玩玩java的哈. 同样,冒泡.选择.快速(这三个之前实现过也写过文章).堆排序,然后做比较. 主要遇到的难点: - -||想轻松点写个封装计时的逻辑,不想每调用一个排序就 ...