安卓删除文件时加载进度条,防止数据过大导致ui假死

其实蛮简单的,这里千万不要使用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。就是这么简单

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值