Android实现文件下载进度显示功能
作者:lijiao 发布时间:2023-12-26 00:42:28
标签: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文件下载动态显示下载进度的内容就为大家分享完毕,希望对大家的学习有所帮助。
0
投稿
猜你喜欢
- 为什么不用SQLite? 原因多种:除了面向对象和关系数据库之间的阻抗不匹配时,SQLite可能是矫枉过正(带来了更多的开销)对于一些简单的
- 前言在Java开发者中,字符串的拼接占用资源高往往是热议的话题.让我们深入讨论一下为什么会占用高资源。在Java中,字符串对象是不可变的,意
- 在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系。可是有的时候,可能存在多个线程多同一个数据进行操作,这样
- Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindServ
- 本文实例为大家分享了SpringMVC实现文件上传与下载的具体代码,供大家参考,具体内容如下0.环境准备1.maven依赖<depen
- MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱
- 前言众所周知Java提供File类,让我们对文件进行操作,下面就来简单整理了一下File类的用法。 话不多说了,来一起看看详细的介绍吧1.基
- 前言众所周知,在多个项目中可能会相同的模块,如果每个项目都去创建一遍的话,这样开发效率会很低。比如在开发一个APP应用的时候,有供APP使用
- Jar包加密工具 ClassFinal介绍ClassFinal 是一款 java class 文件安全加密工具,支持直接加密jar包或war
- 俄罗斯方块Tetris是一款很经典的益智游戏,之前就做了一款桌面版的java俄罗斯方块,这次就尝试着写了一款适用于Android平台的俄罗斯
- 自动生成的代码报错解决办法:把自动xml文件中自动生成的二级缓存注释掉来源:https://blog.csdn.net/weixin_447
- 没有阿里云数据库的可以买个最便宜的,我是新用户9.9元买了一个1.买到后点击左上角的工作台2.3. 4. 5.6.7.8
- 用java实现循环队列的方法:1、添加一个属性size用来记录眼下的元素个数。目的是当head=rear的时候。通过size=0还是size
- 本文实例讲述了C#实现对字符串进行大小写切换的方法。分享给大家供大家参考。具体实现方法如下:C#代码如下:public class Prog
- 本文详细的介绍了Spring组件的实现步骤,分享给大家,具体如下:背景Spring 框架提供了许多接口,可以使用这些接口来定制化 bean
- 1. 查找系统中坏味道的异常处理代码在上篇文章杂谈异常处理try-catch-finally中主要详细介绍了C#异常处理的概念,
- 1 双向链表1.1 双向链表介绍相较单链表,双向链表除了data与next域,还多了一个pre域用于表示每个节点的前一个元素。这样做给双向链
- MainActivity如下: package cn.testgethandsetinfo; import android.os.Bundl
- 本文为大家分享了java微信公众号企业付款的开发代码,供大家参考,具体内容如下详情参照微信开发者文档 企业付款文档 java代码
- 一种可以设置滑动动画的控件,只显示一行布局,在布局文件中的ViewFlipper控件中顺序写好每一行的布局(1).MainActivity.