您的位置:首页 > 移动开发 > Android开发

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下的内容

而我们要将上面几个的内容全部计算出来,然后清除。

下面是清除缓存的工具类

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开发:计算缓存大小并且清空缓存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  缓存 存储