Avant d'en arriver à votre question, voici une brève explication de ces deux types de stockage:
Cache
Ceci est une application répertoire spécifique sur le système de fichiers. Le but de ce répertoire est de stocker des données temporaires de votre application peut avoir besoin de garder autour, entre les sessions, mais peut-être pas vital pour garder pour toujours. Vous avez généralement accès à ce répertoire, Context.getCacheDir()
. Cela fera apparaître comme "Cache" sur les paramètres de votre app.
Fichiers
Comme le répertoire de cache, votre application dispose également d'une application répertoire spécifique pour la tenue de fichiers. Les fichiers dans ce répertoire doit exister jusqu'à ce que l'application explicitement les supprime ou l'application est désinstallée. Vous avez généralement accès à ce répertoire, Context.getFilesDir()
. Ce qui peut apparaître comme des choses différentes sur l'application de l'écran d'info, mais dans votre capture d'écran c'est "USB de Stockage de Données".
REMARQUE: Si vous souhaitez explicitement le placer sur un support externe (généralement une carte SD), vous pouvez utiliser Context.getExternalFilesDir(String type)
.
La Différence
Ces deux répertoires sont spécifiques à votre application (d'autres applications n'ont pas accès). L'une des différences entre le cache et les fichiers de répertoire, c'est que si le système est faible sur le stockage, en premier lieu, il va libérer des ressources à partir de votre répertoire de cache. Le système ne sera pas effacer les données du répertoire des fichiers. Une autre différence est que le répertoire de cache peuvent généralement être effacé manuellement à partir de l'app de l'écran d'info. Le répertoire des fichiers de règle générale, il peut aussi bien, mais en dégageant les fichiers du répertoire effacer le répertoire de cache.
Lequel dois-je utiliser?
Il dépend de l'importance vitale de données par rapport à la durée de vie de votre application. Si vous avez seulement besoin de données pour une seule session et vous doutez de ce que vous aurez jamais besoin d'utiliser que les données de nouveau, alors n'utilisez pas non plus. Il suffit de garder en mémoire jusqu'à ce que vous n'en avez pas besoin. Si vous pensez que vous aurez besoin de réutiliser les données entre plusieurs sessions, mais vous ne pas avoir à conserver une copie papier, utiliser le répertoire de cache. Si vous devez disposer de ces données n'importe quoi, ou si c'est plutôt de données de grande taille que les besoins de stockage persistant, utiliser le répertoire des fichiers. Voici quelques exemples que je pense:
- Cache - A récemment ouvert un e-mail
- Une fois ouvert, mettre en cache les données de sorte que lorsque l'utilisateur veut lire que l'e-mail de nouveau, il se charge instantanément plutôt en utilisant le réseau pour récupérer les mêmes données. Je n'ai pas besoin de garder cela pour toujours, parce que finalement l'utilisateur sera fini avec l'e-mail.
- Fichiers - Une pièce jointe téléchargée à partir d'un e-mail
- C'est une action de l'utilisateur qui est en train de dire "je veux garder ces données afin que je puisse le tirer en arrière à chaque fois que j'en ai besoin." Par conséquent, le mettre dans le répertoire des fichiers que je ne suis pas toujours sur de vouloir supprimer ce fichier jusqu'à ce que l'utilisateur veut les supprimer.
Quand dois-je effacer le répertoire de cache?
De la Context.getCacheDir()
javadoc:
Remarque: vous ne devez pas compter sur le système de suppression de ces fichiers pour vous;
vous devriez toujours avoir un maximum raisonnable, tel que 1 MO, pour le
quantité d'espace que vous consommez avec les fichiers de cache, et de couper les fichiers
en cas de dépassement de l'espace.
Il utilise l'exemple de 1 MO, mais qui peut ou peut ne pas être raisonnable pour votre application. Peu importe, vous devez définir une dur maximale. La raison de cela revient simplement à la conception d'un responsable d'application. Alors, quand devez-vous vérifier? Je recommande de vérifier chaque fois que vous voulez mettre quelque chose dans le répertoire de cache. Voici un simple gestionnaire de cache:
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;
}
}
Bien sûr, cela pourrait être une opération coûteuse, de sorte que vous devez planifier sur la mise en cache sur un thread d'arrière-plan.
En outre, cela pourrait être aussi compliqué que vous le souhaitez. Dans mon exemple, je suis en supposant que tous les fichiers mis en cache sont placés à la racine du répertoire de cache, donc je n'ai pas de vérifier la présence éventuelle de sous-répertoires. La routine de suppression de fichiers peuvent également devenir de plus en plus sophistiquées, telles que la suppression des fichiers par la plus ancienne date d'accès.
Une chose à garder à l'esprit lorsque vous décidez de mettre des données en cache, c'est que vous devez toujours planifier pour le cas où vos données mises en cache n'existe plus. Toujours avoir une routine en place pour récupérer des données par des moyens externes, lorsque votre cache de ne pas l'avoir dans le stockage. De même, vérifiez toujours votre cache avant de récupérer les données en externe. Le but du cache est de couper vers le bas sur l'activité du réseau, des processus, et de fournir une réponse de l'INTERFACE utilisateur de votre application. Afin de l'utiliser de façon responsable :)