O gerenciamento de cache é uma funcionalidade essencial em aplicações Android, quase universalmente implementada para otimizar o desempenho e liberar espaço de armazenamento. Após pesquisar diversas soluções disponíveis online, desenvovli uma classe abrangente que calcula o tamenho total do cache (tanto interno quanto externo) e permite sua limpeza completa. A solução foi testada exaustivamente e demonstrou resultados consistentes.
A seguir, apresento a implementação completa:
public class GerenciadorLimpezaDados {
public static String obterTamanhoTotalCache(Context contexto) throws Exception {
long tamanhoCache = calcularTamanhoPasta(contexto.getCacheDir());
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
tamanhoCache += calcularTamanhoPasta(contexto.getExternalCacheDir());
}
return formatarTamanho(tamanhoCache);
}
public static void limparTodoCache(Context contexto) {
removerDiretorio(contexto.getCacheDir());
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
removerDiretorio(contexto.getExternalCacheDir());
}
}
private static boolean removerDiretorio(File diretorio) {
if (diretorio != null && diretorio.isDirectory()) {
String[] itens = diretorio.list();
for (int i = 0; i < itens.length; i++) {
boolean sucesso = removerDiretorio(new File(diretorio, itens[i]));
if (!sucesso) {
return false;
}
}
}
return diretorio.delete();
}
// Método para obter tamanho de pasta
//Context.getExternalFilesDir() --> SDCard/Android/data/seu_pacote_app/files/
//Context.getExternalCacheDir() --> SDCard/Android/data/seu_pacote_app/cache/
public static long calcularTamanhoPasta(File arquivo) throws Exception {
long tamanho = 0;
try {
File[] listaArquivos = arquivo.listFiles();
if(listaArquivos != null){
for (int i = 0; i < listaArquivos.length; i++) {
if (listaArquivos[i].isDirectory()) {
tamanho = tamanho + calcularTamanhoPasta(listaArquivos[i]);
} else {
tamanho = tamanho + listaArquivos[i].length();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return tamanho;
}
/**
* Formata o tamanho em unidades apropriadas
* @param tamanho
*/
public static String formatarTamanho(double tamanho) {
double kiloByte = tamanho / 1024;
if (kiloByte < 1) {
return tamanho + "Byte";
}
double megaByte = kiloByte / 1024;
if (megaByte < 1) {
BigDecimal resultado1 = new BigDecimal(Double.toString(kiloByte));
return resultado1.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "KB";
}
double gigaByte = megaByte / 1024;
if (gigaByte < 1) {
BigDecimal resultado2 = new BigDecimal(Double.toString(megaByte));
return resultado2.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "MB";
}
double teraBytes = gigaByte / 1024;
if (teraBytes < 1) {
BigDecimal resultado3 = new BigDecimal(Double.toString(gigaByte));
return resultado3.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "GB";
}
BigDecimal resultado4 = new BigDecimal(teraBytes);
return resultado4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
+ "TB";
}
}
Para utilizar esta classe em seu projeto, basta chamar o método obterTamanhoTotalCache(Context) para verificar o tamanho do cache ou limparTodoCache(Context) para remover todos os arquivos de cache.
É importante notar que muitas soluções encontradas online para a remoção de cache são ineficazes, especialmente aquelas que tentam excluir diretórios sem uma abordagem recursiva. Um exemplo de método iandequado é:
private static void removerArquivosPorDiretorio(File diretorio) {
if (diretorio != null && diretorio.exists() && diretorio.isDirectory()) {
for (File item : diretorio.listFiles()) {
item.delete();
}
}
}
Este método falha porque não remove subdiretórios de forma recursiva, deixando muitos arquivos temporários no sistema.