J'ai une question qui semble facile, mais je ne peux pas sembler le faire fonctionner correctement.
J'ai un fichier zip dans mon dossier "actif" que j'ai besoin de décompresser et j'ai un J'ai tout travaillé mais je veux définir le J'utilise le Cela fonctionne mais que deux boucles de temps semble un peu redondant qui font fondamentalement la même chose. P> Je sais qu'il y a un Y a-t-il un moyen pour moi d'accomplir cela? p> p> progessbar code> dans lequel je veux afficher à l'utilisateur comment se passe la progression. P>
progessbar code> max pour être le nombre de fichiers dans le fichier ZIP. Le nombre de fichiers de ce dossier changera parfois de sorte que je souhaite que le
progessbar code> soit relatif au nombre de fichiers contenus dans le zip. P>
Zipinputtream code> -api mais ne semble pas qu'il existe un moyen d'obtenir le nombre de fichiers dans le fichier ZIP. La seule façon dont je peux penser, c'est faire cela: p>
zipfile code> -api qui a une taille
() code> -method, mais il nécessite un chemin d'accès au fichier et, puisque mon fichier est situé dans l'intérieur. Le dossier "Actif" Je suis à peu près sûr que le seul moyen de lire dans ce répertoire est en streaming. P>
4 Réponses :
Votre problème de base semble être que vous devez faire Avez-vous pensé à faire progressar.setmax () code> Avant de commencer à lire le fichier et que vous définissez le maximum en fonction du nombre de fichiers. P>
progressbar.setmax (zin.getsize ()) code> puis en gardant la trace du nombre d'octets que vous avez écris lorsque vous appelez
progressbar.setProgress () code>, au lieu de combien de fichiers que vous avez lus? Cela devrait résoudre votre problème et vous donnera (IMHO) une barre de progression plus précise. P>
Mais que se passe-t-il si un fichier est de 10 kb et un autre est de 10 Mo et il n'y a que deux fichiers dans les archives?
Ne fonctionnera pas, car ZIPINPUTStream n'a pas de méthode appelée get "
Pas sûr de la Getize () CODE> Mais bonne idée de définir les progrès basés sur la taille du fichier, pas les fichiers ZIP compte. Je lisais tout le zip deux fois et je vais me coûter beaucoup de temps car j'ai des tuiles cartographiques et mon zip contient 130 000 fichiers, car la déclaration des progrès basée sur la rédaction d'octets est vraiment efficace et plus rapide. Double chronométrage basique! Merci pour le conseil
Utilisez Exemple: P> zipfile code> API, il existe une méthode code> taille code> qui renvoie le numéro de
ziptries code> dans le fichier zipfile code>. Vous pouvez lire des actifs dossier.
int zipEntriesCount(String path) throws IOException {
ZipFile zf= new ZipFile(path);
return zf.size();
}
Merci pour les réponses. Ce que j'ai fini par faire à l'aide de: APIFILEDEScriptor CODE> API Pour obtenir la taille de fichier du fichier ZIP et régler celui-ci en tant que
progessbar.setmax () code> valeur. Ensuite, en boucle via le contenu de la fermeture à glissière, je incrémente la progression en utilisant la taille du fichier de chaque entrée. Cela fonctionne, mais la seule préoccupation que j'ai est que le
assetfiledescriptor.getlength () code> la valeur ainsi que le
zipenterry.getsize () code> valeurs renvoient un
long code > valeur donc je suis obligé de les jeter à un entier avant de pouvoir définir le maximum et / ou incrémenter le
progessbar code> donc il y a une légère possibilité que je puisse surcharger une valeur entière provoquant une exception, mais ce n'est pas probablement parce que je ne prévois pas que mes tailles de fichiers ne deviennent jamais plus grandes que la capacité de détention maximale d'un entier.
ZipInputStream zin = new ZipInputStream(getAssets().open(
"myFile.zip"));
ZipEntry ze = null;
AssetFileDescriptor mydisc = getAssets().openFd("myFile.zip");
//Size of the zip package
long size = mydisc.getLength();
long increment = 0;
dialog.setMax((int) size);
while ((ze = zin.getNextEntry()) != null) {
increment += (int) ze.getSize();
progessBar.setProgess((int)increment);
//do more stuff..
}
Ceci est ma solution basée sur @Davorbe idée qui consiste à montrer des progrès basés sur la taille du fichier et non au contenu du fichier zip. Exemple d'utilisation: P> private void ExtractMap(String zipFilePath,Context context) {
new Thread(new Runnable() {
@Override
public void run() {
ZipUtility zipUtility = new ZipUtility(new ZipUtility.ZipExtractionCallback() {
@Override
public void progress(int progress, String status) {
((UpdateActivity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
//todo handle ui
}
});
}
@Override
public void finish() {
((UpdateActivity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
//todo handle ui
}
});
}
@Override
public void error(String error) {
((UpdateActivity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
//todo handle ui
}
});
}
});
zipUtility.unzipFromPath(context,
zipFilePath,
context.getFilesDir().getAbsolutePath() + File.separator);
}
}).start();
}