Je suis confronté à un problème étrange et je ne peux pas le déboguer. J'ai implémenté une logique pour télécharger le flux de données et j'utilise Volley pour la même chose, j'ai personnalisé un peu de logique dans HurlStack
, addBodyIfExists
api, de sorte que le corps de type "application/octet -stream "peut être géré.
Ma logique est de publier la progression de l'utilisateur, afin que l'interface utilisateur puisse être mise à jour indiquant la progression de l'utilisateur dans le téléchargement, sous ma logique pour la même chose.
int toRead = length; // File length
byte[] data = new byte[4096];
connection.setDoOutput(true);
if(length != -1) {
connection.setFixedLengthStreamingMode(length);
} else {
connection.setChunkedStreamingMode(4096);
}
OutputStream os;
int i;
int count;
os = connection.getOutputStream();
int progress= 0;
try {
for(i = 0; (count= is.read(data)) > 0; ++i) { // is, is not null and contains a valid input stream
os.write(data, 0, count); // at this line am getting unexpected end of stream
progress+= count;
if(i % 20 == 0) {
rs.deliverProgress(progress, 0L);
progress= 0;
}
}
os.flush();
} finally {
if(is != null) {
is.close();
}
if(os != null) {
os.close();
}
}
lors de l'exécution du code ci-dessus, j'obtiens cela, bien que je l'ai vérifié, le flux de sortie n'est pas nul, ni le flux d'entrée, il échoue lors de la première itération de la boucle de lecture elle-même, je vois qu'il a lu 4096 octets, puis j'essaie d'écrire la même chose.
Java.net.ProtocolException: unexpected end of stream
at com.Android.okhttp.internal.http.HttpConnection$FixedLengthSink.close(HttpConnection.Java:326)
at com.Android.okio.RealBufferedSink.close(RealBufferedSink.Java:174)
at com.Android.okio.RealBufferedSink$1.close(RealBufferedSink.Java:142)
toute aide au débogage ci-dessus sera très appréciée.
This peut vous aider:
Cette exception est levée par FixedLengthInputStream lorsque le nombre d'octets attendu (généralement défini dans l'en-tête content-length de la réponse) est supérieur aux données réelles dans la réponse. Vérifiez que l'en-tête de la longueur du contenu est correct. (Si vous fournissez votre propre valeur pour la longueur du contenu, assurez-vous qu'elle est correcte.)
Il serait utile de voir votre code qui configure le flux d'entrée.