"response response.body (). string ()" ist leer mit okhttp3

7

Ich habe die folgende Klasse erstellt:

%Vor%

Früher funktionierte es bei einer Aktivität, bei der ich Daten auf einem Server auf MySQL geschrieben habe. Und wenn ich es aus dem folgenden Stück Code rufe, bekomme ich eine leere Antwort!

%Vor%

Hier ist, was ich in logcat

bekomme %Vor%

Um es in meiner PostJSON-Klasse abzuschließen, schreibe ich das korrekte Ergebnis in System.out. Dann gib es zurück. Aber die Antwort ist dann leer. Ich kann nicht herausfinden warum.

    
Marc 26.02.2016, 10:54
quelle

4 Antworten

11

Ich habe eine Lösung gefunden, die sich zumindest für mich komisch anhört.

Ich habe das Ende der Klasse wie folgt geändert:

%Vor%

Also, anstatt zweimal response.body().string() aufzurufen, gebe ich es in eine Variable ein. Und es funktioniert!

    
Marc 26.02.2016, 18:29
quelle
7

Der Aufruf von response.body().string() verbraucht den Körper - Sie können ihn daher nicht ein zweites Mal aufrufen. Die Lösung besteht darin, es in einer Variablen zu speichern, wenn Sie es für die weitere Verarbeitung benötigen.

Es gibt auch eine neue Methode in okhttp3 und das ist peekBody(byte count) , die pro Dokumentation bis zum byteCount-Byte aus dem Antworttext auftaucht und sie als neuen Antworttext zurückgibt.

    
MarkoMilos 16.03.2016 15:50
quelle
3

Sie haben den Text gelesen, als Sie string() aufgerufen und die Hintergrundquelle geleert haben. OkHttp versucht, die Backing-Ressource so schnell wie möglich freizugeben. Das Lesen des Körpers in eine Variable ist der richtige Weg, um ihn in mehr als einer Verwendung zu übergeben oder mehr zu speichern.

Normalerweise müssen Sie den Körper nicht schließen, aber auf Android, wo wir keine Try-with-Ressourcen haben, würde ich empfehlen, die Handschrift endlich zu schließen.

Hier sind die Dokumente zum Thema: Ссылка

  

Der Antworttext kann nur einmal verwendet werden.

     

Diese Klasse kann zum Streamen sehr großer Antworten verwendet werden. Zum Beispiel ist es möglich, diese Klasse zu verwenden, um eine Antwort zu lesen, die größer ist als der gesamte Speicher, der dem aktuellen Prozess zugewiesen ist. Es kann sogar eine Antwort streamen, die größer ist als der Gesamtspeicher auf dem aktuellen Gerät. Dies ist eine häufige Anforderung für Video-Streaming-Anwendungen.

     

Da diese Klasse die vollständige Antwort im Speicher nicht puffert, liest die Anwendung möglicherweise die Bytes der Antwort nicht erneut. Verwenden Sie diese eine Aufnahme, um die gesamte Antwort mit bytes () oder string () in den Speicher zu schreiben. Oder streamen Sie die Antwort entweder mit source (), byteStream () oder charStream ().

    
user823629 21.06.2016 23:58
quelle
1

Wir müssen den Inhalt der Antwort in eine Variable vom Typ string speichern.

%Vor%     
jorge santos 24.10.2017 16:38
quelle

Tags und Links