SORU
30 Mart 2012, Cuma


Ne zaman Android önbellek dir temizlemek için?

İnternet (designer iş için vitrin) resimleri görüntüleyen bir uygulama var. İç önbellek dizininde benim içerik önbellekleme başladım, ama app içerik önbellek boyutu yaklaşık 150 MB sürebilir. Ve dokümanlar android ne diyor :

Her zaman önbellek dosyalarını kendiniz muhafaza etmeli ve içinde kal 1 MB gibi boş yer yok makul sınırı. Kullanıcı zaman kaldırır uygulama, bu dosyalar kaldırılır.

Akımlar uygulaması (Galaxy Nexus) ve uygulama 110 MB önbellek boyutu aldım. Ama garip olan, Google Akımlar Ve Google Maps bir içerik önbellek gibi uygulamalar (USB Depolama Veri) olarak adlandırılır :

enter image description here

Bu 'USB Depolama Veri' önceki uygulamanın kullandığı. Ve uygulama önbelleğe alma uygulamak, tüm your application files in cache boyutu her zaman için üzerinde döngü bir şey eklemek ve karşılaştırın temizleyin gerekiyor mu? Ya da bazı Android uygulaması önbellek dizini temizlemek için onun zaman karar verene kadar içeriği önbellekleme duruyorsun ?

Diğer uygulamalar önbellek geniş içeriği ile ne Android yönetme önbellek akışı, ya da en azından ne olduğunu bilmek gerçekten ilgileniyorum.

CEVAP
9 NİSAN 2012, PAZARTESİ


Sorunuza geçmeden önce, burada iki depolama türleri hakkında kısa bir açıklama:

Önbellek

Bu dosya sistemi üzerinde uygulama-belirli bir dizin. Bu dizin niyet uygulamanız oturumlar arasında saklamak gerekebilir geçici veri depolamak, ancak onları sonsuza kadar tutmak için önemli olmayabilir. Genellikle Context.getCacheDir() ile bu dizine erişim. Bu "" ayarlar app. Önbellek olarak görünecektir

Dosyaları

Önbellek dizini gibi, uygulama aynı zamanda holding dosyalar için uygulamaya özel bir dizin var. Bu dizindeki dosyalar uygulaması açıkça onları silene kadar var olacak ya da bu uygulama kaldırıldı. Genellikle Context.getFilesDir() bu dizin erişim. Bu uygulamanın bilgi ekranında çeşitli şeyler gibi görünebilir, ama ekran görüntüsü bu "USB Veri Depolama".

NOT:Eğer açıkça dış ortam (genellikle bir SD kart) üzerine yerleştirmek istiyorsanız, Context.getExternalFilesDir(String type) kullanabilirsiniz.

Fark

Her iki dizin uygulamanıza özgü sadece (diğer uygulamalar erişim yok). Önbellek dosya ve dizin arasındaki farklardan biri ise sistem depolama alanı azalırsa, kaynakların boşa gidiyor ilk başta önbellek dizininde. Sistem dosyaları dizininden herhangi bir veri temizlemek değil. Başka bir fark önbellek dizini genellikle el ile uygulama bilgi ekranından silinebilir. Dosyaları dizin tipik olarak iyi olabilir, ama dosyalar dizini temizlemek de önbelleği Temizle dizin.

Hangisini kullanabilirim?

Nasıl hayati verileri uygulamanızın ömrü karşılaştırıldığında bağlıdır. Sana tek bir oturum için veri lazım ve hiç bir veri tekrar kullanmanız gerekir şüphen varsa ya da kullanmayın. Sadece ihtiyacın yok kadar bellekte Sakla. Eğer şüpheleniyorsanız birden fazla seans arasında verileri yeniden gerekir, ama yokvarsert bir kopyasını tutmak için, önbellek dizini kullanın. Eğer bu veri ne olursa olsun sahip olmalıdır, ya da eğer kalıcı olarak saklanması gereken büyük veri oldukça, dosyaları dizin kullanın. Burada aklıma bazı örnekler:

  • Önbellek - yeni açılan Bir e-posta
    • Kullanıcı, bu e-posta tekrar okumak istiyor, bu yüzden veri önbellek açılınca, anında tekrar ağ aynı verileri almak için kullanmak yerine yükler. Sonunda kullanıcı e-posta ile bitmiş olacak çünkü bu sonsuza dek tutmak için ihtiyacım yok.
  • Dosyaları ek bir e-posta adresinden indirilebilir
    • Bu "ihtiyacım olduğu zaman geri çekin, böylece bu verileri tutmak istiyorum." diyerek kullanıcı tarafından bir eylem. Bu nedenle, hiç kullanıcı silinmiş istediği kadar bu dosyayı silmek istemiyorum gibi dosyaları dizine yerleştirin.

Ne zaman önbellek dizini temizlemek gerekir?

Context.getCacheDir() javadocs:

Sistem;bu dosyaları silmek güvenmemelisiniz not: her zaman makul bir maksimum 1 MB, bu gibi olmalıdır uzay miktarda önbellek dosyaları ile tüketmek ve bu dosyalar erik bu alanı aşan zaman.

1) örnek kullanır, ancak bu uygulama için makul olmayabilir. Ne olursa olsun, sabit bir maksimum ayarlamanız gerekir. Bunun nedeni, sadece sorumlu bir uygulama tasarımı için aşağı gelir. Ne zaman kontrol etmek gerekir? Önbellek dizininde bir şey koymak istediğiniz her zaman kontrol öneriyoruz. Burada çok basit bir önbellek yöneticisi:

public class CacheManager {

    private static final long MAX_SIZE = 5242880L; // 5MB

    private CacheManager() {

    }

    public static void cacheData(Context context, byte[] data, String name) throws IOException {

        File cacheDir = context.getCacheDir();
        long size = getDirSize(cacheDir);
        long newSize = data.length   size;

        if (newSize > MAX_SIZE) {
            cleanDir(cacheDir, newSize - MAX_SIZE);
        }

        File file = new File(cacheDir, name);
        FileOutputStream os = new FileOutputStream(file);
        try {
            os.write(data);
        }
        finally {
            os.flush();
            os.close();
        }
    }

    public static byte[] retrieveData(Context context, String name) throws IOException {

        File cacheDir = context.getCacheDir();
        File file = new File(cacheDir, name);

        if (!file.exists()) {
            // Data doesn't exist
            return null;
        }

        byte[] data = new byte[(int) file.length()];
        FileInputStream is = new FileInputStream(file);
        try {
            is.read(data);
        }
        finally {
            is.close();
        }

        return data;
    }

    private static void cleanDir(File dir, long bytes) {

        long bytesDeleted = 0;
        File[] files = dir.listFiles();

        for (File file : files) {
            bytesDeleted  = file.length();
            file.delete();

            if (bytesDeleted >= bytes) {
                break;
            }
        }
    }

    private static long getDirSize(File dir) {

        long size = 0;
        File[] files = dir.listFiles();

        for (File file : files) {
            if (file.isFile()) {
                size  = file.length();
            }
        }

        return size;
    }
}

Tabii ki, bu bir arka plan iş parçacığı üzerinde önbelleğe alma planı gerekir çok pahalı bir işlem olabilir.

Ayrıca, bu gibi karmaşık olabilir. Benim örnekte, önbelleğe alınan dosya önbellek dizini kök yerleştirilir varsayıyorum, potansiyel için alt dizinleri kontrol etmiyorum. Dosyaları silmek için rutin da daha sofistike, en eski erişim tarihine göre dosyaları silmek gibi olabilir.

Önbellek veri için karar verirken akılda tutulması gereken bir şey her zaman önbelleğe alınan veri artık yok bu durum için plan gerekir. Her zaman önbelleği depoya sahip olmayan dış veri almak için bir rutin var. Aynı şekilde, her zaman kontrol veri almak için önce önbelleği dışarıdan. Önbelleğin amacı, ağ etkinliğini azaltması, uzun işlemler ve uygulamanızda duyarlı bir kullanıcı arayüzü sağlamaktır. Bunu sorumlu bir şekilde kullanın :)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • brokenbellsVEVO

    brokenbellsV

    11 EYLÜL 2009
  • Caramthros

    Caramthros

    10 AĞUSTOS 2007
  • Doc Adams

    Doc Adams

    20 HAZİRAN 2007