服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - android实现清理缓存功能

android实现清理缓存功能

2022-11-08 14:44zhyue28 Android

这篇文章主要为大家详细介绍了android实现清理缓存,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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缓存

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/**
 * 获取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;
 }

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

原文链接:https://blog.csdn.net/zhyue28/article/details/103123266

延伸 · 阅读

精彩推荐