Volley - direkt in Datei herunterladen (kein Speicherbyte-Array)

8

Ich verwende Volley als meinen Netzwerkstack in einem Projekt, an dem ich gerade arbeite. Ein Teil meiner Anforderungen besteht darin, möglicherweise sehr große Dateien herunterzuladen und sie im Dateisystem zu speichern.

Ich habe mir die Implementierung von Volley angeschaut, und es scheint, dass die einzige Methode, mit der Volley arbeitet, darin besteht, eine ganze Datei in ein potenziell riesiges Byte-Array herunterzuladen und dann die Behandlung dieses Byte-Arrays an einen Callback-Handler zu verschieben.

Da diese Dateien sehr groß sein können, mache ich mir Sorgen über einen Speicherfehler während des Download-Vorgangs.

Gibt es eine Möglichkeit, Volley mitzuteilen, dass alle Bytes von einem HTTP-Eingabestream direkt in einen Datei-Ausgabestream verarbeitet werden sollen? Oder würde dies erfordern, dass ich mein eigenes Netzwerkobjekt implementiere?

Ich konnte online kein Material darüber finden, daher wären alle Vorschläge willkommen.

    
Gil Moshayof 23.10.2014, 07:29
quelle

1 Antwort

3

Okay, also habe ich eine Lösung gefunden, die das Bearbeiten von Volley selbst beinhaltet. Hier ist ein Spaziergang durch:

Die Netzwerkantwort kann kein Byte-Array mehr enthalten. Es muss einen Eingabestream enthalten. Dadurch werden alle Anforderungsimplementierungen sofort unterbrochen, da sie darauf angewiesen sind, dass NetworkResponse ein öffentliches Bytearraymitglied enthält. Der am wenigsten invasive Weg, den ich gefunden habe, ist das Hinzufügen einer "toByteArray" -Methode innerhalb von NetworkResponse, und dann ein wenig Refactoring, wobei jeder Verweis auf ein Byte-Array diese Methode anstelle des entfernten Byte-Array-Members verwendet. Dies bedeutet, dass der Übergang des Eingabestroms in ein Byte-Array während der Antwortanalyse erfolgt. Ich bin mir nicht ganz sicher, was die langfristigen Auswirkungen davon sind, und daher wäre ein Testen der Einheiten / der Beitrag der Gemeinschaft hier eine große Hilfe. Hier ist der Code:

%Vor%

Um die NetworkResponse vorzubereiten, müssen wir das BasicNetwork bearbeiten, um die NetworkResponse korrekt zu erstellen (in BasicNetwork.performRequest ):

%Vor%

Das ist es. Sobald die Daten in der Netzwerkantwort ein Eingabestream sind, kann ich meine eigenen Anfragen erstellen, die sie direkt in einen Datei-Ausgabestrom parsen können, der nur einen kleinen Speicherpuffer enthält.

Nach ein paar anfänglichen Tests scheint das in Ordnung zu sein, ohne andere Komponenten zu beschädigen, aber eine Änderung wie diese erfordert wahrscheinlich etwas intensiveres Testen & amp; Peer Reviewing, also werde ich diese Antwort nicht als richtig markieren, bis mehr Leute wiegen, oder ich sehe, dass es robust genug ist, um sich darauf zu verlassen.

Bitte fühlen Sie sich frei, diese Antwort zu kommentieren und / oder die Antworten selbst zu posten. Das fühlt sich wie ein schwerer Fehler in Volleys Design an, und wenn Sie Fehler mit diesem Design sehen oder sich selbst bessere Designs denken können, dann würde es meiner Meinung nach allen nützen.

    
Gil Moshayof 23.10.2014, 15:25
quelle