欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android实现清理缓存功能

程序员文章站 2022-06-06 23:35:35
android之清理缓存实现,供大家参考,具体内容如下 一. 清理缓存首先要搞清楚清理哪些东西 1、app本身的功能比如录像,录音,更新都会产生文件,需要清理 2、app的默认缓...

android之清理缓存实现,供大家参考,具体内容如下

一. 清理缓存首先要搞清楚清理哪些东西

1、app本身的功能比如录像,录音,更新都会产生文件,需要清理
2、app的默认缓存地址cache

二. 搞清楚要清理的文件夹位置

1、首先app自身的功能就要看自己把它放在了什么位置
2、默认缓存地址:getactivity().getexternalcachedir();
这个位置是在storage/emulated/0/android/data/com.xxxxxapp/cache

三.代码功能模块:

1、获取app缓存大小,以字节为单位
2、获取某个文件夹的大小,以字节为单位
3、把字节单位换算成常用单位
4、把缓存大小设置到页面,清理前一次,清理后一次
5、删除文件夹功能
6、清除app缓存

/**
 * 获取app的缓存大小
 * 1. 录制的视频/storage/emulated/0/xueliangapp/video/1573972925136.mp4
 * 2. 录制的音频/storage/emulated/0/xueliangapp/radio/1573972925136.amr
 * 3. 下载的更新包/storage/emulated/0/android/data/com.sdxzt.xueliangapp_v3/files/download/xueliang_update.apk
 * 4. 缓存/storage/emulated/0/android/data/com.sdxzt.xueliangapp_v3/cache
*/
  file videodir,radiodir,filesdir,cachedir;
  private string getappcache(){
    long filesize = 0;
    string cachesize = "0kb";
    videodir = new file(environment.getexternalstoragedirectory()+"/xueliangapp/video");
    log.d(tag, "getappcache: videodir大小: "+getdirsize(videodir));
    radiodir = new file(environment.getexternalstoragedirectory()+"/xueliangapp/radio");
    log.d(tag, "getappcache: radiodir大小: "+getdirsize(radiodir));
    filesdir = getactivity().getexternalfilesdir(environment.directory_downloads);
    log.d(tag, "getappcache: filesdir大小: "+getdirsize(filesdir));
    ///storage/emulated/0/android/data/com.sdxzt.xueliangapp_v3/files,这里面有download文件夹,里面是下载的更新包
    cachedir = getactivity().getexternalcachedir();
    log.d(tag, "getappcache: cachedir大小: "+getdirsize(cachedir));
    ///storage/emulated/0/android/data/com.sdxzt.xueliangapp_v3/cache
    filesize += getdirsize(getactivity().getfilesdir());
    filesize += getdirsize(getactivity().getcachedir());//这行是默认的缓存地址,看图片什么的会在这里积累缓存
    filesize += getdirsize(videodir);
    filesize += getdirsize(radiodir);
    filesize += getdirsize(filesdir);
    filesize += getdirsize(cachedir);
    string filesizestr = formatfilesize(filesize);
    log.d(tag, "getappcache: 总缓存大小: "+filesizestr);
    return filesizestr;
  }

  /**
   * 获取文件大小(字节为单位)
   * @param dir
   * @return
   */
  private long getdirsize(file dir) {
    if (dir == null) {
      return 0;
    }
    if (!dir.isdirectory()) {
      return 0;
    }
    long dirsize = 0;
    file[] files = dir.listfiles();
    for (file file : files) {
      if (file.isfile()) {
        dirsize += file.length();//文件的长度就是文件的大小
      } else if (file.isdirectory()) {
        dirsize += file.length();
        dirsize += getdirsize(file); // 递归调用继续统计
      }
    }
    return dirsize;
  }

  /**
   * 格式化文件长度
   * @param filesize
   * @return
   */
  private string formatfilesize(long filesize){
    decimalformat df = new decimalformat("#0.00");//表示小数点前至少一位,0也会显示,后保留两位

    string filesizestring = "";
    if (filesize < 1024) {
      filesizestring = df.format((double) filesize) + "b";
    } else if (filesize < 1048576) {
      filesizestring = df.format((double) filesize / 1024) + "kb";
    } else if (filesize < 1073741824) {
      filesizestring = df.format((double) filesize / 1048576) + "mb";
    } else {
      filesizestring = df.format((double) filesize / 1073741824) + "g";
    }
    return filesizestring;
  }
  private void setappcache() {
    string filesize = getappcache();
    filesizetv.settext(filesize);
    log.d(tag, "setappcache: 重新显示缓存大小");
    log.d(tag, "setappcache: 当前缓存"+filesize);
  }

  public void clearappcache(final activity activity){

    final handler handler = new handler(){
      @override
      public void handlemessage(@nonnull message msg) {
        super.handlemessage(msg);
        log.d(tag, "handlermessage: ");
        if (msg.what == 1) {
          setappcache();
          log.d(tag, "handlermessage: 缓存清除完毕");
          toastutil.showmsg(getactivity(),"缓存清除完毕");
        }else {
          toastutil.showmsg(getactivity(),"缓存清除失败");
          log.d(tag, "handlermessage: 缓存清除失败");
        }
      }
    };

    new thread(new runnable() {
      @override
      public void run() {
        log.d(tag, "run: ");
        message msg = new message();
        try {
          clearcachefolder(videodir,system.currenttimemillis());
          clearcachefolder(radiodir,system.currenttimemillis());
          clearcachefolder(filesdir,system.currenttimemillis());
          clearcachefolder(cachedir,system.currenttimemillis());
          msg.what = 1;
        }catch (exception e){
          e.printstacktrace();
          msg.what = -1;
        }
        handler.sendmessage(msg);
      }
    }).start();
  }


  /**
   * 清除缓存目录
   * @param dir 目录
   * @param curtime 当前系统时间
   */
  private int clearcachefolder(file dir,long curtime){
    int deletedfiles = 0;
    if (dir!= null && dir.isdirectory()) {
      try {
        for (file child:dir.listfiles()) {
          if (child.isdirectory()) {
            deletedfiles += clearcachefolder(child, curtime);
          }
          if (child.lastmodified() < curtime) {
            if (child.delete()) {
              deletedfiles++;
            }
          }
        }
      } catch(exception e) {
        e.printstacktrace();
      }
    }
    log.d(tag, "clearcachefolder: 清除目录: "+dir.getabsolutepath());
    return deletedfiles;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。