Gerenciamento de Cache em Android: Cálculo e Limpeza de Dados Temporários

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.

Tags: android cache Gerenciamento de Armazenamento otimização de desempenho java

Publicado em 6-13 20:04 por Thomas