android显示缓存大小和清除缓存功能
2017-10-06 13:00
363 查看
项目中经常需要一个功能,就是显示缓存的大小和点击清除缓存功能。下面来写怎么实现该功能
andorid 缓存的话,一般分
1.cache缓存,cache缓存又分为外部sd卡cache和内部sd卡cache。
内部sd卡cache路径在
data/data//cache 下的文件
外部sd卡cache路径在
SDCard/Android/data//cache下的文件
2.File存储
路径在内部sd卡中,
data/data//files下的内容
3.database存储
路径在内部sd卡中,
data/data//databases下的内容
4.sharedPrefence存储。
路径在内部sd卡中,
data/data//shared_prefs下的内容
而我们要将上面几个的内容全部计算出来,然后清除。
下面是清除缓存的工具类
然后我们写个测试
activity_show_acache_and_clear_achache.xml文件
activity文件
将获取context的方法放在application中,用来共用。先自定义一个application.
绑定控件用到了ButterKnife插件,具体使用可以看
ButterKnife插件
这样就能实现显示缓存大小和清除缓存功能。
参考资料:
Android 清除缓存详细实现(显示缓存大小)
Android开发:计算缓存大小并且清空缓存
andorid 缓存的话,一般分
1.cache缓存,cache缓存又分为外部sd卡cache和内部sd卡cache。
内部sd卡cache路径在
data/data//cache 下的文件
外部sd卡cache路径在
SDCard/Android/data//cache下的文件
2.File存储
路径在内部sd卡中,
data/data//files下的内容
3.database存储
路径在内部sd卡中,
data/data//databases下的内容
4.sharedPrefence存储。
路径在内部sd卡中,
data/data//shared_prefs下的内容
而我们要将上面几个的内容全部计算出来,然后清除。
下面是清除缓存的工具类
public class DataCleanManager { /** * 总的缓存数大小 * * @param context * @return */ public static String getTotalCacheSize(Context context) throws Exception { long cacheSize = getFloderSize(context.getCacheDir());//获取data/data/cn.xxx.xxx(当前包)/cache 下的文件大小 内部sd卡cache文件大小 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))//是否有sd卡,如果有sd卡 { cacheSize += getFloderSize(context.getExternalCacheDir());//获取SDCard/Android/data/你的应用包名/cache/目录 外部sd卡cache文件大小 } cacheSize += getFloderSize(new File("/data/data/" + context.getPackageName() + "/databases")); // 本应用所有数据库文件大小 data/data/<package name>/databases cacheSize += getFloderSize(new File("/data/data/" + context.getPackageName() + "/shared_prefs"));//清除本应用SharedPreference(/data/data/<package name>/shared_prefs) cacheSize += getFloderSize(context.getFilesDir());//清除/data/data/<package name>/files下的内容 return getformatSize(cacheSize); } /** * 清除缓存 * * @param dir * @return */ private static boolean deleteDir(File dir) { if (dir != null && dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } return dir.delete(); } /** * 清除所有缓存 * * @param dir * @return */ public static void clearAllCache(Context context) { deleteDir(context.getCacheDir()); if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { deleteDir(context.getExternalCacheDir()); } deleteDir(new File("/data/data/" + context.getPackageName() + "/databases"));// 本应用所有数据库文件大小 data/data/<package name>/databases deleteDir(new File("/data/data/" + context.getPackageName() + "/shared_prefs"));//清除本应用SharedPreference(/data/data/<package name>/shared_prefs) deleteDir(context.getFilesDir());//清除/data/data/<package name>/files下的内容 } /** * 获取文件的大小 * * @param file * @return */ public static long getFloderSize(File file) throws Exception { long size = 0; try { File[] flieList = file.listFiles();//获取该目录下所有file和目录 for (int i = 0; i < flieList.length; i++) { //如果下面还有文件 if (flieList[i].isDirectory()) { size = size + getFloderSize(flieList[i]); } else { size = size + flieList[i].length();//获取文件大小 } } } catch (Exception e) { e.printStackTrace(); } return size; } /** * 格式化单位 * * @return */ public static String getformatSize(double size) { double kiloByte = size / 1024; if (kiloByte < 1) { // return size + "Byte"; return "0K"; } double megaByte = kiloByte / 1024; if (megaByte < 1) { BigDecimal result1 = new BigDecimal(Double.toString(kiloByte)); return result1.setScale(2, BigDecimal.ROUND_HALF_UP) .toPlainString() + "KB"; } double gigaByte = megaByte / 1024; if (gigaByte < 1) { BigDecimal result2 = new BigDecimal(Double.toString(megaByte)); return result2.setScale(2, BigDecimal.ROUND_HALF_UP) .toPlainString() + "MB"; } double teraBytes = gigaByte / 1024; if (teraBytes < 1) { BigDecimal result3 = new BigDecimal(Double.toString(gigaByte)); return result3.setScale(2, BigDecimal.ROUND_HALF_UP) .toPlainString() + "GB"; } BigDecimal result4 = new BigDecimal(teraBytes); return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB"; } }
然后我们写个测试
activity_show_acache_and_clear_achache.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv_save_size" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="" /> <TextView android:id="@+id/tv_clear" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="清除缓存" /> </LinearLayout>
activity文件
package test.my.com.hellochina.view; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.TextView; import android.widget.Toast; import java.lang.ref.WeakReference; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import test.my.com.hellochina.R; import test.my.com.hellochina.app.MyApplication; import test.my.com.hellochina.util.DataCleanManager; /** * 显示缓存和删除缓存 */ public class ShowACacheAndClearAchacheActivity extends Activity { @BindView(R.id.tv_save_size) TextView tvSaveSize; @BindView(R.id.tv_clear) TextView tvClear; MyHandler mHandler = new MyHandler(this); private Thread mThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show_acache_and_clear_achache); ButterKnife.bind(this); try { tvSaveSize.setText(getString(R.string.cache_size,DataCleanManager.getTotalCacheSize(this))); } catch (Exception e) { e.printStackTrace(); } } @OnClick(R.id.tv_clear) public void onViewClicked(View view) { switch (view.getId()) { case R.id.tv_clear://清除缓存 clearAllCache(); break; } } public static class MyHandler extends Handler { private WeakReference<Context> refrence; @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: Toast.makeText(MyApplication.getContext(), "清理完成", Toast.LENGTH_SHORT).show(); ShowACacheAndClearAchacheActivity showACacheAndClearAchacheActivity = (ShowACacheAndClearAchacheActivity) refrence.get(); if (showACacheAndClearAchacheActivity != null) { try { showACacheAndClearAchacheActivity.tvSaveSize.setText(MyApplication.getContext().getString(R.string.cache_size,DataCleanManager.getTotalCacheSize(MyApplication.getContext()))); } catch (Exception e) { e.printStackTrace(); } } break; } } public MyHandler(Context context) { refrence = new WeakReference<>(context); } } /** * 清除缓存 */ private void clearAllCache() { mThread = new Thread(new clearCache(this));//创建一个thread,用于清理内存, mThread.start(); } /** * Runable 对象 */ private static class clearCache implements Runnable { private WeakReference<Context> refrence; public clearCache(Context context) { refrence = new WeakReference<>(context); } @Override public void run() { clear(); } private void clear() { try { DataCleanManager.clearAllCache(MyApplication.getContext()); Thread.sleep(3000); if (DataCleanManager.getTotalCacheSize(MyApplication.getContext()).startsWith("0"))//如果完成 { ShowACacheAndClearAchacheActivity showACacheAndClearAchacheActivity = (ShowACacheAndClearAchacheActivity) refrence.get(); if (showACacheAndClearAchacheActivity != null) { try { showACacheAndClearAchacheActivity.mHandler.sendEmptyMessage(0); } catch (Exception e) { e.printStackTrace(); } } } } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } @Override protected void onDestroy() { super.onDestroy(); mHandler.removeCallbacksAndMessages(null); mThread.stop(); } }
将获取context的方法放在application中,用来共用。先自定义一个application.
public class MyApplication extends Application { private static Context context; @Override public void onCreate() { super.onCreate(); context = getApplicationContext(); } public static Context getContext() { return context; } }
AndroidManifest中定义 <application android:name=".app.MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> </application>
绑定控件用到了ButterKnife插件,具体使用可以看
ButterKnife插件
这样就能实现显示缓存大小和清除缓存功能。
参考资料:
Android 清除缓存详细实现(显示缓存大小)
Android开发:计算缓存大小并且清空缓存
相关文章推荐
- Android开发记录20-获取缓存大小和清除缓存功能
- Android中获取缓存大小和清除缓存功能
- Android记录20-获取缓存大小和清除缓存功能
- Android记录20-获取缓存大小和清除缓存功能
- Android 获取缓存大小和清除缓存功能
- Android记录20-获取缓存大小和清除缓存功能
- Android开发记录20-获取缓存大小和清除缓存功能
- Android获取缓存大小和清除缓存功能
- android计算当前缓存大小与清除功能
- Android开发记录20-获取缓存大小和清除缓存功能
- Android 清除缓存详细实现(显示缓存大小)
- Android 获取缓存大小和清除缓存功能
- android_获取缓存大小和清除缓存功能
- Android---------------->获取缓存大小和清除缓存功能
- android -应用软件获取缓存大小和清除缓存功能
- Android小记:-获取缓存大小和清除缓存功能
- Android记录20-获取缓存大小和清除缓存功能
- Android记录20-获取缓存大小和清除缓存功能
- Android获取缓存大小和清除缓存功能
- Android记录20-获取缓存大小和清除缓存功能