因为在项目开发时。有这种简单需求,问谷歌,网络上也有好多Utils工具类,可是比較冗余。自己就简单的写了一个简单帮助类。


/**
* 下载文件,更新UI简单帮助类
*
* @author jarlen
*
*/
public class DownLoadHelper
{
private static final int DOWN_BEGIN = 0;
private static final int DOWN_UPDATA = 1;
private static final int DOWN_FINISH = 2;
private static final int DOWN_ERROR = 3; private Context mContext; private TextView mTextView; private ProgressBar mBar; private Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
if (!Thread.currentThread().isInterrupted())
{
switch (msg.what)
{
case DOWN_BEGIN:
if (mTextView != null)
{
mTextView.setText("開始下载");
} if(mBar != null)
{
mBar.setProgress(0);
} break;
case DOWN_UPDATA:
int factor = msg.arg1; if (mTextView != null)
{
mTextView.setText(factor + "%");
} if(mBar != null)
{
mBar.setProgress(factor);
} break; case DOWN_FINISH:
if (mTextView != null)
{
mTextView.setText("下载完毕");
} if(mBar != null)
{
mBar.setProgress(100);
} break;
case DOWN_ERROR:
if (mTextView != null)
{
mTextView.setText("下载错误");
} if(mBar != null)
{
mBar.setProgress(0);
} break; default:
break;
}
}
};
}; public DownLoadHelper(Context context)
{
this.mContext = context;
} /**
* 设置下载时,须要更新的UI TextView
* @param view
*/
public void setUpdataView(TextView view)
{
this.mTextView = view;
} /**
* 设置下载时,须要更新的UI,ProgressBar
* @param bar
*/
public void setUpdataBar(ProgressBar bar)
{
this.mBar = bar;
} /**
* 開始下载
* @param url
* 文件下载地址
* @param path
* 文件保存地址
*/
public void startDownLoad(final String url, final String path)
{ new Thread()
{
public void run()
{
sendMsg(DOWN_BEGIN, 0);
try
{
long downloadSize = downloadUpdateFile(url, path);
if (downloadSize > 0)
{
sendMsg(DOWN_FINISH, 0);
}
} catch (Exception e)
{
e.printStackTrace();
sendMsg(DOWN_ERROR, 0);
} };
}.start();
} private long downloadUpdateFile(String down_url, String path)
throws Exception
{
int down_step = 1;// 提示step
int totalSize;// 文件总大小
int downloadCount = 0;// 已经下载好的大小
int updateCount = 0;// 已经上传的文件大小
InputStream inputStream;
OutputStream outputStream;
URL url = new URL(down_url);
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
httpURLConnection.setConnectTimeout(30 * 1000);
httpURLConnection.setReadTimeout(30 * 1000);
// 获取下载文件的size
totalSize = httpURLConnection.getContentLength();
if (httpURLConnection.getResponseCode() == 404)
{
sendMsg(DOWN_ERROR, 0);
throw new Exception("fail!");
}
inputStream = httpURLConnection.getInputStream();
File dir = new File(path);
if (!dir.exists())
{
dir.mkdir();
}
String name = down_url.substring(down_url.lastIndexOf("/") + 1,
down_url.length()); File updateFile = new File(dir, name);
outputStream = new FileOutputStream(updateFile, false);// 文件存在则覆盖掉
byte buffer[] = new byte[1024];
int readsize = 0;
while ((readsize = inputStream.read(buffer)) != -1)
{
outputStream.write(buffer, 0, readsize);
downloadCount += readsize;// 时时获取下载到的大小
// 每次增长1%
if (updateCount == 0
|| (downloadCount * 100 / totalSize - down_step) >= updateCount)
{
updateCount += down_step;
sendMsg(DOWN_UPDATA, updateCount); }
}
if (httpURLConnection != null)
{
httpURLConnection.disconnect();
}
inputStream.close();
outputStream.close();
return downloadCount;
} private void sendMsg(int flag, int factor)
{
Message msg = new Message();
switch (flag)
{ case DOWN_BEGIN:// 開始
case DOWN_FINISH:// 完毕
case DOWN_ERROR:// 失败 break;
case DOWN_UPDATA:// 更新进度条
msg.arg1 = factor;
break; default:
break;
}
msg.what = flag;
handler.sendMessage(msg);
} }

使用时简单说明下。

DownLoadHelper helper1 = new DownLoadHelper(this);
helper1.setUpdataView(tv1);
helper1.startDownLoad("http://img1.2345.com/appsimg/wallpaper/4/139460306960.jpg", path);

/********************************************/

Demo源代码下载地址

http://download.csdn.net/detail/jarlen/8552443

没有认真地检查。可能有bug,使用的伙伴请自己debug下。并通知我一下,谢谢

v=3&uin=791415371&site=qq&menu=yes">

基于Android 下载文件时,更新UI简单帮助类的更多相关文章

  1. 安卓下载文件怎样更新UI进度

    曾经写过几篇关于下载的文章.总的来说是下面几点: 1.维护一个下载进程的Hashmap,key:使用Md5进行处理后的文件下载地址,value为下载的Task. 以防止下载反复.并将信息保存至数据库. ...

  2. 下载文件时-修改文件名字 Redis在Windows中安装方法 SVN安装和使用(简单版) WinForm-SQL查询避免UI卡死 Asp.Net MVC Https设置

    下载文件时-修改文件名字   1后台代码 /// <summary> /// 文件下载2 /// </summary> /// <param name="Fil ...

  3. AsyncTask用法解析-下载文件动态更新进度条

    1. 泛型 AysncTask<Params, Progress, Result> Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入. ...

  4. 转载: 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)

    最近在做一个下载工具时,发现CSDN上的资源下载时竟然没有被拦截到,经过分析,终于有了一个发现,解决了我之前做文件下载时的乱码问题,所以转载这篇释疑文章,希望有人可以看到,可以从中得到帮助,也用来备忘 ...

  5. Handler实现线程之间的通信-下载文件动态更新进度条

    1. 原理 每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息. 2. ...

  6. Android 下载文件及写入SD卡

    Android 下载文件及写入SD卡,实例代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  7. Firefox下载文件时中文名乱码问题

    为了形象化,先看几张不同浏览器下下载文件时的效果图: 1:Firefox 36.0.1 2:IE8 3:Chrome 40.0.2214.93 m 4:360 7.1.1.322 很明显在Firefo ...

  8. 使用HttpURLConnection下载文件时出现 java.io.FileNotFoundException彻底解决办法

    使用HttpURLConnection下载文件时经常会出现 java.io.FileNotFoundException文件找不到异常,下面介绍下解决办法 首先设置tomcat对get数据的编码:con ...

  9. 正确处理下载文件时HTTP头的编码问题(Content-Disposition)

    留坑 参考: 正确处理下载文件时HTTP头的编码问题(Content-Disposition) HTTP协议header中Content-Disposition中文文件名乱码 文件下载,content ...

随机推荐

  1. 数学之路-python计算实战(2)-初遇pypy

    PyPy是Python开发人员为了更好的Hack Python创建的项目.此外,PyPy比CPython是更加灵活,易于使用和试验,以制定详细的功能在不同情况的实现方法,能够非常easy实施. 该项目 ...

  2. [to do list][PCB][questions]and[plan]

    Questions 2014/5/29 1.最后检查布板,除了用netlist查,还有没有更快的方法? 2014/6/8 1.      R的location中心究竟是哪个? watermark/2/ ...

  3. js基础语法(一)

    学习网站参考:http://www.w3school.com.cn/ 写入html输出: document.write('test out put'); 例子: http://www.w3school ...

  4. hnnu 11546 Sum of f(x) (求一个数的全部约数和)

    代码: #include<cstdio> #include<cstring> #define N 200000 using namespace std; long long f ...

  5. Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布

    首先是准备工作,去QT主页下载独立的QT类库安装包以及完整QT SDK安装包,还有QT Creator for windows 版 下载地址:http://qt.nokia.com/downloads ...

  6. [SVN]创建本地的SVN仓库

    本地创建SVN仓库,就算是自己平时写代码也养成使用SVN的习惯. 环境: OS:Mac OS X10.9.1 SVN Version:1.7.10 创建本地SVN仓库: $svnadmin creat ...

  7. VC++ 视频播放器 图文步骤记录

    1.安装DirectShow9.0 SDK DirectShow9 SDK下载链接http://download.csdn.net/detail/jindou910101/5591169 2.运行Di ...

  8. Android推断程序前后台状态

    public class AppStatusService extends Service { private static final String TAG = "AppStatusSer ...

  9. hdu3622(二分+two-sat)

    传送门:Bomb Game 题意:给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸的范围半径都一样,控制爆炸的半径使得所有的爆炸范围 ...

  10. TestApe - Unit testing for embedded software

    TestApe - Unit testing for embedded software About this site Welcome - This site is TestApe.com. Mos ...