基于Android下载并解压Zip文件,更新UI简单帮助类
2015-04-01 18:39
357 查看
类似于:/article/11697354.html
下载文件:
解压Zip文件
整个帮助类:
没有认真地检查,可能有bug,使用的伙伴请自己debug下,并通知我一下,谢谢
下载文件:
/** * 下载文件 * * @param down_url * @param output * @param tmpDir */ private void download(String down_url, File output, File tmpDir) { InputStream inputStream = null; OutputStream outputStream = null; File tmp = null; int down_step = 1;// 提示step int totalSize = 0; int downloadCount = 0;// 已经下载好的大小 int updateCount = 0;// 已经上传的文件大小 try { tmp = File.createTempFile("download", ".tmp", tmpDir); URL url = new URL(down_url); HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); httpURLConnection.setConnectTimeout(30 * 1000); httpURLConnection.setReadTimeout(30 * 1000); // 获取下载文件的size totalSize = httpURLConnection.getContentLength(); inputStream = new URL(down_url).openStream(); outputStream = new BufferedOutputStream(new FileOutputStream(tmp)); byte[] buffer = new byte[BUFFER_SIZE]; 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; sendMessage(DOWN_UPDATA, updateCount); } } if (httpURLConnection != null) { httpURLConnection.disconnect(); } tmp.renameTo(output); tmp = null; } catch (IOException e) { sendMessage(DOWN_ERROR, 0); throw new RuntimeException(e); } finally { try { if (tmp != null) { tmp.delete(); tmp = null; } if (inputStream != null) { inputStream.close(); inputStream = null; } if (outputStream != null) { outputStream.close(); outputStream = null; } } catch (Exception e2) { sendMessage(DOWN_ERROR, 0); } sendMessage(DOWN_FINISH, 0); } }
解压Zip文件
public class ZipUnPack { private static final int BUFFER_SIZE = 8192; private String _zipFile; private String _location; private byte[] _buffer; /** * Constructor. * * @param zipFile * Fully-qualified path to .zip file * @param location * Fully-qualified path to folder where files should be written. * Path must have a trailing slash. */ public ZipUnPack(String zipFile, String location) { _zipFile = zipFile; _location = location; _buffer = new byte[BUFFER_SIZE]; dirChecker(""); } public Boolean unzip() { FileInputStream fin = null; ZipInputStream zin = null; OutputStream fout = null; File outputDir = new File(_location); File tmp = null; Boolean isSucess = true; try { fin = new FileInputStream(_zipFile); zin = new ZipInputStream(fin); ZipEntry ze = null; while ((ze = zin.getNextEntry()) != null) { Log.d("Decompress", "Unzipping " + ze.getName()); if (ze.isDirectory()) { dirChecker(ze.getName()); } else { tmp = File.createTempFile("decomp", ".tmp", outputDir); fout = new BufferedOutputStream(new FileOutputStream(tmp)); copyStream(zin, fout, _buffer, BUFFER_SIZE); zin.closeEntry(); fout.close(); fout = null; tmp.renameTo(new File(_location + ze.getName())); tmp = null; } } zin.close(); zin = null; } catch (IOException e) { isSucess = false; throw new RuntimeException(e); } finally { if (tmp != null) { try { tmp.delete(); } catch (Exception ignore) { } } if (fout != null) { try { fout.close(); } catch (Exception ignore) { ; } } if (zin != null) { try { zin.closeEntry(); } catch (Exception ignore) { ; } } if (fin != null) { try { fin.close(); } catch (Exception ignore) { ; } } isSucess = true; } return isSucess; } private void dirChecker(String dir) { File f = new File(_location + dir); if (!f.isDirectory()) { f.mkdirs(); } } /** * Copy from one stream to another. Throws IOException in the event of error * (for example, SD card is full) * * @param is * Input stream. * @param os * Output stream. * @param buffer * Temporary buffer to use for copy. * @param bufferSize * Size of temporary buffer, in bytes. */ private void copyStream(InputStream is, OutputStream os, byte[] buffer, int bufferSize) throws IOException { try { for (;;) { int count = is.read(buffer, 0, bufferSize); if (count == -1) { break; } os.write(buffer, 0, count); } } catch (IOException e) { throw e; } } }
整个帮助类:
public class ZipDownLoadHelper
{
private static final int BUFFER_SIZE = 1024;
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 static final int UNPACK_BEGIN = 4;
private static final int UNPACK_END = 5;
private static final int UNPACK_ERROR = 6;
private Context mContext;
private Thread mDownLoadThread;
private OnZipDownLoadAndUnpackListener mOnZipDownLoadAndUnpackListener;
private Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
if (!Thread.currentThread().isInterrupted())
{
switch (msg.what)
{
case DOWN_BEGIN :
if (mOnZipDownLoadAndUnpackListener != null)
{
mOnZipDownLoadAndUnpackListener.onDownLoadStart();
}
break;
case DOWN_UPDATA :
int factor = msg.arg1;
if (mOnZipDownLoadAndUnpackListener != null)
{
mOnZipDownLoadAndUnpackListener
.onDownLoading(factor);
}
break;
case DOWN_FINISH :
if (mOnZipDownLoadAndUnpackListener != null)
{
mOnZipDownLoadAndUnpackListener.onDownLoadFinish();
}
break;
case DOWN_ERROR :
if (mOnZipDownLoadAndUnpackListener != null)
{
mOnZipDownLoadAndUnpackListener.onDownLoadError();
}
break;
case UNPACK_BEGIN :
if (mOnZipDownLoadAndUnpackListener != null)
{
mOnZipDownLoadAndUnpackListener.onZipUnpackStart();
}
break;
case UNPACK_END :
if (mOnZipDownLoadAndUnpackListener != null)
{
mOnZipDownLoadAndUnpackListener.onZipUnpackFinish();
}
break;
case UNPACK_ERROR:
break;
default :
break;
}
}
};
};
public ZipDownLoadHelper(Context context)
{
this.mContext = context;
}
/**
* 开启线程
*
* @param url
*/
public void startDownLoadAndZip(final String url)
{
mDownLoadThread = new Thread()
{
@Override
public void run()
{
sendMessage(DOWN_BEGIN, 0);
// Temp folder for holding asset during download
File zipDir = ExternalStorage.getSDCacheDir(mContext, "tmp");
// File path to store .zip file before unzipping
File zipFile = new File(zipDir.getPath() + "/temp.zip");
// Folder to hold unzipped output
File outputDir = ExternalStorage.getSDCacheDir(mContext,
"wms");
try
{
download(url, zipFile, zipDir);
unzipFile(zipFile, outputDir);
} finally
{
zipFile.delete();
}
}
};
mDownLoadThread.start();
}
@SuppressWarnings("deprecation")
public void destroyThread()
{
mDownLoadThread.stop();
}
/** * 下载文件 * * @param down_url * @param output * @param tmpDir */ private void download(String down_url, File output, File tmpDir) { InputStream inputStream = null; OutputStream outputStream = null; File tmp = null; int down_step = 1;// 提示step int totalSize = 0; int downloadCount = 0;// 已经下载好的大小 int updateCount = 0;// 已经上传的文件大小 try { tmp = File.createTempFile("download", ".tmp", tmpDir); URL url = new URL(down_url); HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); httpURLConnection.setConnectTimeout(30 * 1000); httpURLConnection.setReadTimeout(30 * 1000); // 获取下载文件的size totalSize = httpURLConnection.getContentLength(); inputStream = new URL(down_url).openStream(); outputStream = new BufferedOutputStream(new FileOutputStream(tmp)); byte[] buffer = new byte[BUFFER_SIZE]; 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; sendMessage(DOWN_UPDATA, updateCount); } } if (httpURLConnection != null) { httpURLConnection.disconnect(); } tmp.renameTo(output); tmp = null; } catch (IOException e) { sendMessage(DOWN_ERROR, 0); throw new RuntimeException(e); } finally { try { if (tmp != null) { tmp.delete(); tmp = null; } if (inputStream != null) { inputStream.close(); inputStream = null; } if (outputStream != null) { outputStream.close(); outputStream = null; } } catch (Exception e2) { sendMessage(DOWN_ERROR, 0); } sendMessage(DOWN_FINISH, 0); } }
private void sendMessage(int flag, int factor)
{
Message msg = new Message();
switch (flag)
{
case DOWN_BEGIN :// 开始
case DOWN_FINISH :// 完成
case DOWN_ERROR :// 失败
case UNPACK_BEGIN :
case UNPACK_END :
case UNPACK_ERROR:
break;
case DOWN_UPDATA :// 更新进度条
msg.arg1 = factor;
break;
default :
break;
}
msg.what = flag;
handler.sendMessage(msg);
}
/**
* 解压文件
*
* @param zipFile
* @param destination
*/
private void unzipFile(File zipFile, File destination)
{
sendMessage(UNPACK_BEGIN, 0);
ZipUnPack decomp = new ZipUnPack(zipFile.getPath(),
destination.getPath() + File.separator);
Boolean isOk = decomp.unzip();
if(!isOk)
{
sendMessage(UNPACK_ERROR, 0);
}
else
{
sendMessage(UNPACK_END, 0);
}
}
/**
* 绑定监听
*
* @param listener
*/
public void setOnZipDownLoadAndUnpackListener(
OnZipDownLoadAndUnpackListener listener)
{
this.mOnZipDownLoadAndUnpackListener = listener;
}
public interface OnZipDownLoadAndUnpackListener
{
/**
* 下载开始
*/
public void onDownLoadStart();
/**
* 下载更新
*
* @param factor
*/
public void onDownLoading(int factor);
/**
* 下载失败
*/
public void onDownLoadError();
/**
* 下载完成
*/
public void onDownLoadFinish();
/**
* 解压开始
*/
public void onZipUnpackStart();
/**
* 解压失败
*/
public void onZipUnpackError();
/**
* 解压完成
*/
public void onZipUnpackFinish();
}
}
没有认真地检查,可能有bug,使用的伙伴请自己debug下,并通知我一下,谢谢
相关文章推荐
- 基于Android 下载文件时,更新UI简单帮助类
- 基于Android 下载文件时,更新UI简单帮助类
- 基于Android 下载文件时,更新UI简单帮助类
- Android基于IIS的APK下载(二)显示更新列表
- Android文件下载,解压zip文件,清空文件夹
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- 基于vue2.0版本的手机端mint-ui 的Loadmore上拉刷新下拉加载的方法,对于初学者来说很有帮助,开始写走了很多弯路,网上找到这个方法,简单实用,不多说看代码……
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- 【源码分享下载】每日更新之Android源码之简单定时器
- Android基于IIS的APK下载(一)自定义更新控件
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- 问题标签用户 android 下载 跨界面更新UI