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.
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.
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 ().
Wir müssen den Inhalt der Antwort in eine Variable vom Typ string speichern.
%Vor%