android解压zip文件进度条,Android之zip文件加密解压及进度条的实现

zip文件的解压能够使用java的zip库,可是没有实现对加密文件的解压功能,这里能够使用zip4j来实现。详细能够參看该文《Android下zip压缩文件加密解密的完美解决方式》。该文件里没有实现解压进度的功能,这里进行一简单的实现。

Zip4jSp.java

/**

* unzip file to dest dir with password in thread.

*

* @param zipFile

* @param dest

* @param passwd

* @param charset

* null or empty is utf-8

* @param Handler

* handler in thread

* @param isDeleteZipFile

* true:delete zip file.false:not.

* @throws ZipException

*/

public static void Unzip(final File zipFile, String dest, String passwd,

String charset, final Handler handler, final boolean isDeleteZipFile)

throws ZipException {

ZipFile zFile = new ZipFile(zipFile);

if (TextUtils.isEmpty(charset)) {

charset = "UTF-8";

}

zFile.setFileNameCharset(charset);

if (!zFile.isValidZipFile()) {

throw new ZipException(

"Compressed files are not illegal, may be damaged.");

}

File destDir = new File(dest); // Unzip directory

if (destDir.isDirectory() && !destDir.exists()) {

destDir.mkdir();

}

if (zFile.isEncrypted()) {

zFile.setPassword(passwd.toCharArray());

}

final ProgressMonitor progressMonitor = zFile.getProgressMonitor();

Thread progressThread = new Thread(new Runnable() {

@Override

public void run() {

Bundle bundle = null;

Message msg = null;

try {

int percentDone = 0;

// long workCompleted=0;

// handler.sendEmptyMessage(ProgressMonitor.RESULT_SUCCESS)

if (handler == null) {

return;

}

handler.sendEmptyMessage(CompressStatus.START);

while (true) {

Thread.sleep(1000);

percentDone = progressMonitor.getPercentDone();

bundle = new Bundle();

bundle.putInt(CompressKeys.PERCENT, percentDone);

msg = new Message();

msg.what = CompressStatus.HANDLING;

msg.setData(bundle);

handler.sendMessage(msg);

if (percentDone >= 100) {

break;

}

}

handler.sendEmptyMessage(CompressStatus.COMPLETED);

} catch (InterruptedException e) {

bundle = new Bundle();

bundle.putString(CompressKeys.ERROR, e.getMessage());

msg = new Message();

msg.what = CompressStatus.ERROR;

msg.setData(bundle);

handler.sendMessage(msg);

e.printStackTrace();

}

finally

{

if(isDeleteZipFile)

{

zipFile.deleteOnExit();//zipFile.delete();

}

}

}

});

progressThread.start();

zFile.setRunInThread(true);

zFile.extractAll(dest);

}

注:

(1)、字符集默认採用UTF-8

(2)、解压文件在线程中进行,所以须要setRunInThread(true).因为採用线程中解压文件,所以调用该函数时相当于异步运行,调用代码会直接往下走,须要注意并加以处理。

(3)、进度条另开了一个线程来处理,并将处理的结果以handler的形式发送

(4)、使用zipFile.deleteOnExit()而不是zipFile.delete();由于使用线程解压时,尽管从progressMonitor获得的percentDone已经达到了100,而其实数据并没有全然解压完毕。这时退出循环执行finally的delete函数,假设使用zipFile.delete(),将会删除文件,这样会使兴许的解压失败。而使用zipFile.deleteOnExit()函数,该函数是当VM终止时才会删除文件,与zipFile.delete()删除文件不同。APP在执行时,VM始终是在的,所以这样删除可以确保兴许的解压可以正常进行。或者不去删除文件。

(5)、handler的代码见后文的MainActivity.java。

CompressKeys.java

package com.sparkle.compress;

public class CompressKeys {

public final static String PERCENT="PERCENT";

public final static String ERROR="ERROR";

}

CompressStatus.java

package com.sparkle.compress;

public class CompressStatus {

public final static int START=0;

public final static int HANDLING=1;

public final static int COMPLETED=2;

public final static int ERROR=3;

}

MainActivity.java

private Handler _handler=new Handler(){

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case CompressStatus.START:

{

setTitle("Start...");

break;

}

case CompressStatus.HANDLING:

{

Bundle bundle=msg.getData();

int percent=bundle.getInt(CompressKeys.PERCENT);

setTitle(percent+"%");

break;

}

case CompressStatus.ERROR:

{

Bundle bundle=msg.getData();

String error=bundle.getString(CompressKeys.ERROR);

_info_textView.setText(error);

break;

}

case CompressStatus.COMPLETED:

{

setTitle("Completed");

byte[] data=FileSp.read(tempFilePath);

try {

String dataStr=new String(data,"UTF-8");

_info_textView.setText(dataStr);

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

break;

}

default:

break;

}

};

};

}

以下是效果图

765fc5132c0dac8c3c1dd9e09cdf4d6c.png

Common4Android是一个通用Android工具库,包含网络库、线程管理器、常用Util工具、热修复,它拥有良好的架构,低耦合、高内聚,使用起来非常轻松。 -基类 ClassName Description BaseApplication.java Application基类,启动SDCard监听、网络状态监听。 BaseActiivty.java Activity基类,封装常用方法及Activity管理。 -管理器 ClassName Description ActivityManager.java Activity管理工具类,可以获得当前引用启动的Activity实例。 HotFixManager.java 热修复patch加载工具类。 LRUCache.java LRUCache。 ThreadPoolManager.java 应用线程池管理。 -网络处理 ClassName Description HttpTag.java Api接口配置类。 TaskManager.java 网络任务管理类。 HttpDataRequest.java 通用请求类。 HttpPostRequest.java Post请求类。 -工具类 ClassName Description AnimationUtil.java 动画效果工具类,提供缩放、透明度、位移、旋转动画方法。 AppInfoUtil.java 应用信息工具类,获取应用版本号、版本编码。 BitmapCacheUtil.java Bitmap缓存工具类,封装bitmap本地存储方法。 BitmapEffectUtil.java Bitmap特效实现类,封装bitmap特效实现方法,如:老照片、RGB偏移等。 BitmapUtil.java Bitmap常用工具类,Bitmap数据类型转换、圆角、缩放、倒影。 ConvertUtil.java 转换工具类,进行对象的类型转换。 DateUtil.java 日期工具类,日期转换生肖、日期转换星座、日期相互转换。 DesUtil.java DES加密工具类。 DeviceUtil.java 设备信息获取工具类,获得设备型号、设备生产厂商、屏幕尺寸、GPS状态、wifi状态等。 DialogUtil.java 弹窗工具类,ProgressDialog,AlertDialog,Toast弹出封装。 FileUtil.java 文件工具类,文件常用方法,获得文件大小、文件大小转换。 MD5Util.java MD5加密工具类。 RegexUtil.java 常用正则表达式工具类。 SDCardUtil.java SD卡信息管理工具类。 SharedPreferencesUtil.java SharedPreferences工具类。 StringUtil.java 字符串处理工具类。 SystemIntentUtil.java 系统Intent工具类,常用的系统Intent跳转函数,如:打电话、发短信等。 示例代码: - NetWork HttpDataRequest request = new HttpDataRequest(); request.setTag(HttpTag.TEST); request.setSort(Constants.REQUEST_METHOD_GET); request.setGzip(true); request.setRetry(false); request.setNeedAuth(false); TaskManager.startHttpDataRequset(request, new HttpDataResponse() {     @Override     public void onHttpRecvOK(HttpTag tag, Object extraInfo, Object result) {         DialogUtil.showToast(MainActivity.this, (String) result, Toast.LENGTH_LONG);     }     @Override     public void onHttpRecvError(HttpTag tag, HttpCode retCode, String msg) {         DialogUtil.showToast(MainActivity.this, "onHttpRecvError retCode:"   retCode   " msg:"   msg, Toast.LENGTH_LONG);     }     @Override     public void onHttpRecvCancelled(HttpTag tag) {         DialogUtil.showToast(MainActivity.this, "onHttpRecvCancelled", Toast.LENGTH_LONG);     } });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值