Page 1 of 1

[Fixed] Fehler beim Laden von Städten

Posted: 23 May 2016, 22:04
by torwin
Seit einem der letzten Updates lassen sich gespeicherte Städte auf meinem Nexus 9 nicht mehr laden.
Ich verwende die aktuelle Android N Preview, aber vielleicht lässt sich das Problem trotzdem lösen.

Die App hat die Berechtigung zum Schreiben auf den Speicher. Es werden auch Daten gespeichert. Beim Öffnen kommt allerdings die Meldung "Laden fehlgeschlagen".

Ich habe beim Laden mal "adb logcat" laufen lassen und folgende Meldungen gesehen:

Code: Select all

E CityKeeper: java.util.zip.ZipException: Not in GZIP format
I StopWatch: Needed 3ms to process step Read file of load city
I StopWatch: Needed 0ms to process step Prepare city of load city
I StopWatch: Needed 3ms to proceed load city
I GameStack: Leave stage LoadCityStage
Wäre super, wenn sich das Problem lösen lässt.
Das Spiel ist nämlich sehr gut und ich würde es gerne wieder spielen können, ohne die Stände zu verlieren.

Posted: 16 Jun 2016, 11:25
by Lobby
Sieht nach einem Fehler in der gzip-Implementierung aus :?
Besteht das Problem noch immer?

Posted: 16 Jun 2016, 20:43
by torwin
Das Problem besteht leider immer noch :(

Habe gerade das neuste Android Update installiert, es hat jedoch keine Besserung gebracht.

Wäre echt super, wenn das Laden wieder funktionieren würde. Hat ja schließlich unter Android N bis zu einem TheoTown Update funktioniert.

Es ist ein wirklich super Spiel. Würde es gerne wieder auf auf dem Tablet spielen können.

Posted: 18 Jun 2016, 12:36
by Lobby
Vielleicht ist es auch ein Problem beim Speichern. Kannst du mir bitte mal eine solche Stadt an info[at]theotown.de schicken? Dann könnte ich das mal ausschließen. Die Städte liegen unter TheoTown/maps

Ansonsten fällt mir als naive Lösung nur ein, die Komprimierung ausschaltbar zu machen, aber dann werden die Dateien enorm groß.

Posted: 24 Jun 2016, 11:43
by Lobby
Vielen Dank nochmals für die Unterstützung. Ich konnte den Fehler nun endlich lokalisieren. Er liegt im

Code: Select all

stream.skip(skipBytes);
Dieser wird beim Laden dazu benutzt, den Header der Stadtdatei zu überspringen. In Versionen vor Android N hat dieser problemlos funktioniert.

Offenbar wurde die Implementierung dahingehend geändert, dass nun nicht mehr die angegebene Anzahl von Bytes übersprungen wird, wenn man auf einem BufferedInputStream arbeitet. Daher muss man nun die Rückgabe der skip(...)-Methode beachten, und wenn nötig nochmals aufrufen. Das sieht nun so aus

Code: Select all

while (skipBytes > 0) {
    skipBytes -= stream.skip(skipBytes);
}
Alles in allem ist das Problem damit behoben (Version 158) :)

Posted: 24 Jun 2016, 15:14
by theotheoderich
wird

Code: Select all

skipBytes 
denn wirklich irgendwann zwingend immer

Code: Select all

> 0
, oder gibt es die Wahrscheinlichkeit einer Endlosschleife?

Posted: 24 Jun 2016, 19:18
by Lobby
'Sollte' nicht vorkommen können, sicherheitshalber habe ich noch ein

Code: Select all

stream.available() > 0
ergänzt. Das stellt sicher, dass noch Bytes zum Überspringen vorhanden sind.

Posted: 24 Jun 2016, 21:26
by torwin
Vielen Dank für die Behebung.
Funktioniert jetzt einwandfrei.