其实蛮简单的,这里千万不要使用handler这些了,不然频繁的刷新ui导致假死是很恶心的,但是不做处理,本身也会出现无响应的情况。下面贴下我的代码,代码很简单,使用AsyncTask;
public class DeleteExtractorTask extends AsyncTask<Void, Integer, Long> {
private Context mContext;
private final ProgressDialog mDialog;
private int total;
private int curPosi;
private String path;
public DeleteExtractorTask(String filePath, int total, Context context) {
if (context != null) {
mDialog = new ProgressDialog(context);
} else {
mDialog = null;
}
mContext = context;
this.total = total;
this.path = filePath;
}
@Override
protected Long doInBackground(Void... voids) {
publishProgress(0, total);
deleteDirectory(path);
return null;
}
@Override
protected void onPreExecute() {
if (mDialog != null) {
mDialog.setTitle("共" + total + "个文件");
mDialog.setMessage("正在删除");
mDialog.setCanceledOnTouchOutside(false);
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.show();
}
}
@Override
protected void onPostExecute(Long aLong) {
super.onPostExecute(aLong);
if (mDialog != null && mDialog.isShowing()) {
FileUtils.mkdirFiles();
mDialog.dismiss();
}
if (isCancelled())
return;
}
@Override
protected void onProgressUpdate(Integer... values) {
if (mDialog == null)
return;
if (values.length > 1) {
int max = values[1];
mDialog.setMax(max);
} else {
mDialog.setProgress(values[0].intValue());
}
}
private boolean deleteDirectory(String dir) {
// 如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dir.endsWith(File.separator))
dir = dir + File.separator;
File dirFile = new File(dir);
// 如果dir对应的文件不存在,或者不是一个目录,则退出
if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
return false;
}
boolean flag = true;
// 删除文件夹中的所有文件包括子目录
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
// 删除子文件
if (files[i].isFile()) {
curPosi++;
publishProgress(curPosi);
flag = FileUtils.deleteFile(files[i].getAbsolutePath());
if (!flag)
break;
}
// 删除子目录
else if (files[i].isDirectory()) {
curPosi++;
publishProgress(curPosi);
flag = deleteDirectory(files[i]
.getAbsolutePath());
if (!flag)
break;
}
}
if (!flag) {
return false;
}
// 删除当前目录
if (dirFile.delete()) {
return true;
} else {
return false;
}
}
}
这里计算文件大小就是递归遍历文件目录,只要是文件就+1。就是这么简单