Ich versuche, eine Fortschrittsanzeige zu implementieren, um den Fortschritt eines mehrteiligen Dateiuploads anzuzeigen.Verfolgen des Fortschritts des mehrteiligen Dateiuploads mit OKHTTP
Ich habe aus einem Kommentar zu dieser Antwort gelesen - https://stackoverflow.com/a/24285633/1022454, dass ich die Senke um den RequestBody übergeben muss und einen Rückruf bereitstellen, der die bewegten Bytes verfolgt.
Ich habe eine benutzerdefinierte RequestBody erstellt und die Senke mit einer CustomSink-Klasse umwickelt, aber durch Debuggen kann ich sehen, dass die Bytes geschrieben werden von RealBufferedSink ln 44 und die benutzerdefinierte Senke Schreibmethode wird nur einmal ausgeführt, mir nicht erlaubt verfolgen Sie die bewegten Bytes.
private class CustomRequestBody extends RequestBody {
MediaType contentType;
byte[] content;
private CustomRequestBody(final MediaType contentType, final byte[] content) {
this.contentType = contentType;
this.content = content;
}
@Override
public MediaType contentType() {
return contentType;
}
@Override
public long contentLength() {
return content.length;
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
CustomSink customSink = new CustomSink(sink);
customSink.write(content);
}
}
private class CustomSink implements BufferedSink {
private static final String TAG = "CUSTOM_SINK";
BufferedSink bufferedSink;
private CustomSink(BufferedSink bufferedSink) {
this.bufferedSink = bufferedSink;
}
@Override
public void write(Buffer source, long byteCount) throws IOException {
Log.d(TAG, "source size: " + source.size() + " bytecount" + byteCount);
bufferedSink.write(source, byteCount);
}
@Override
public void flush() throws IOException {
bufferedSink.flush();
}
@Override
public Timeout timeout() {
return bufferedSink.timeout();
}
@Override
public void close() throws IOException {
bufferedSink.close();
}
@Override
public Buffer buffer() {
return bufferedSink.buffer();
}
@Override
public BufferedSink write(ByteString byteString) throws IOException {
return bufferedSink.write(byteString);
}
@Override
public BufferedSink write(byte[] source) throws IOException {
return bufferedSink.write(source);
}
@Override
public BufferedSink write(byte[] source, int offset, int byteCount) throws IOException {
return bufferedSink.write(source, offset, byteCount);
}
@Override
public long writeAll(Source source) throws IOException {
return bufferedSink.writeAll(source);
}
@Override
public BufferedSink writeUtf8(String string) throws IOException {
return bufferedSink.writeUtf8(string);
}
@Override
public BufferedSink writeString(String string, Charset charset) throws IOException {
return bufferedSink.writeString(string, charset);
}
@Override
public BufferedSink writeByte(int b) throws IOException {
return bufferedSink.writeByte(b);
}
@Override
public BufferedSink writeShort(int s) throws IOException {
return bufferedSink.writeShort(s);
}
@Override
public BufferedSink writeShortLe(int s) throws IOException {
return bufferedSink.writeShortLe(s);
}
@Override
public BufferedSink writeInt(int i) throws IOException {
return bufferedSink.writeInt(i);
}
@Override
public BufferedSink writeIntLe(int i) throws IOException {
return bufferedSink.writeIntLe(i);
}
@Override
public BufferedSink writeLong(long v) throws IOException {
return bufferedSink.writeLong(v);
}
@Override
public BufferedSink writeLongLe(long v) throws IOException {
return bufferedSink.writeLongLe(v);
}
@Override
public BufferedSink emitCompleteSegments() throws IOException {
return bufferedSink.emitCompleteSegments();
}
@Override
public OutputStream outputStream() {
return bufferedSink.outputStream();
}
}
Hat jemand ein Beispiel dafür, wie ich das machen würde?
Dies scheint nicht zu funktionieren, wenn kleine Dateien über eine langsame Netzwerkverbindung hochladen. Siehe https://github.com/square/okhttp/issues/1078. Gibt es eine Lösung für diesen Fall? – coalmee
@Edy Bolos Gibt es eine Möglichkeit, es in Verbindung mit RxJava & Observable zu verwenden? – Sree
Um Ihre Frage zu beantworten: alles kann in einem Observable verpackt werden :) Aber ich muss jemand anderen lassen, um es zu tun. Mein einziger Vorschlag ist vielleicht, ein "BehaviorSubject" zu verwenden, um den Fortschrittswert in "UploadsHandler" zu emittieren. –