Ich habe eine Frage, die einfach scheint, aber ich kann nicht scheinen, dass sie richtig funktioniert.
Ich habe eine ZIP-Datei in meinem Ordner 'assets', die ich entpacken muss, und ich habe eine ProgessBar
, in der ich dem Benutzer anzeigen möchte, wie der Fortschritt abläuft.
Ich habe alles funktioniert, aber ich möchte den ProgessBar
max-Wert auf die Anzahl der Dateien in der ZIP-Datei setzen. Die Anzahl der Dateien in diesem Ordner wird sich manchmal ändern, daher möchte ich, dass ProgessBar
relativ zu der Anzahl der Dateien in der Zip-Datei ist.
Ich benutze die ZipInputStream
-API, aber scheint nicht, es gibt eine Möglichkeit, die Anzahl der Dateien in der ZIP-Datei zu erhalten. Ich kann nur daran denken:
Das funktioniert, aber zwei while-Schleifen zu haben, scheint etwas überflüssig zu sein, was im Grunde dasselbe tut.
Ich weiß, dass es eine ZipFile
-API gibt, die eine size()
-Methode hat, aber es benötigt einen Pfad zur Datei und da sich meine Datei im Ordner 'Assets' befindet, bin ich ziemlich sicher der einzige Weg Aus diesem Verzeichnis zu lesen ist durch Streaming.
Gibt es eine Möglichkeit für mich, dies zu erreichen?
Danke für die Antworten. Was ich am Ende getan habe, benutze die: AssetFileDescriptor
API, um die Dateigröße der Zip-Datei zu erhalten und diese als ProgessBar.setMax()
-Wert festzulegen. Wenn ich dann den Inhalt der ZIP-Datei durchlaufe, inkrementiere ich den Fortschritt, indem ich die Größe der einzelnen Einträge verwende. Das funktioniert, aber die einzige Sorge, die ich habe, ist, dass der AssetFileDescriptor.getLength()
-Wert sowie die ZipEntry.getSize()
-Werte einen long
-Wert zurückliefern, so dass ich gezwungen bin, sie auf eine Ganzzahl zu setzen, bevor ich das Maximum setzen und / oder erhöhen kann ProgessBar
, so gibt es eine leichte Möglichkeit, dass ich einen Integer-Wert überladen könnte, der eine Ausnahme verursacht, aber das ist nicht wahrscheinlich, weil ich nicht voraussehe, dass meine Dateigröße jemals größer wird als die maximale Kapazität einer ganzen Zahl.
Nicht die beste Lösung, aber es funktioniert.
Ich kenne die ZipFile
API, aber es erfordert eine Zeichenfolge, die übergeben wird, aber ich bin mir nicht sicher, was der Pfad zu diesem Verzeichnis ist oder wie man es bekommt?
Ihr grundlegendes Problem scheint zu sein, dass Sie progressBar.setMax()
ausführen müssen, bevor Sie mit dem Lesen der Datei beginnen, und Sie setzen das Maximum basierend auf der Anzahl der Dateien.
Haben Sie darüber nachgedacht, progressBar.setMax(zin.getSize())
zu machen und dann zu verfolgen, wieviele Bytes Sie beim Aufruf von progressBar.setProgress()
geschrieben haben, anstatt wie viele Dateien Sie gelesen haben? Dies sollte Ihr Problem lösen und Ihnen (imho) einen genaueren Fortschrittsbalken geben.
Tags und Links java android zip android-assets