因为在项目开发时。有这种简单需求,问谷歌,网络上也有好多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下。并通知我一下,谢谢