Upload (hochgeladene Bytes) status mit Retrofit?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Upload (hochgeladene Bytes) status mit Retrofit?

    Hi Leute,

    ich lade einen ca. 800KB langen base64 string per POST und Retrofit 2 hoch:

    Java-Quellcode

    1. void postSpecialData(String base64, Callback callback);


    wobei das Callback das Retrofit 2 Interface ist, mit:

    Quellcode

    1. void onResponse(Call<T> call, Response<T> response);
    2. void onFailure(Call<T> call, Throwable t);
    Dann kann ich mein Code Aufrufen, mit:

    Java-Quellcode

    1. getRestCommunicator().postSpecialData(encryptedBase64, new Callback() {
    2. @Override public void onResponse(Call call, Response response) {
    3. toast("Response code " + response.code());
    4. }
    5. @Override public void onFailure(Call call, Throwable t) {
    6. toast("Failure REST CALL");
    7. }
    8. });
    Wie kann ich beim POST call den Fortschritt der hochgeladenen bytes abgreifen? Möchte es in einer Progressbar wiederspiegeln.

    Danke schonmal im voraus
  • Thnx bin dabei.
    Wobei ich habe das

    Java-Quellcode

    1. String base64
    nicht als Datei gespeichert und wollte es auch nicht speichern. Dieser String ist ca. 500 kB groß und den kann ich nach upload verwerfen.

    Java-Quellcode

    1. @Override
    2. public void writeTo(BufferedSink sink) throws IOException {
    3. StringReader in = new StringReader(base64);
    4. char[] buffer = new char[2048];
    5. int uploaded = 0;
    6. try {
    7. int read;
    8. while ((read = in.read(buffer, uploaded, buffer.length)) != -1) {
    9. uploaded += read;
    10. System.out.println("BUFFER " + buffer);
    11. sink.write(new String(buffer).getBytes(), 0, read);
    12. this.callback.onProgressUpdate(uploaded);
    13. }
    14. } catch(IndexOutOfBoundsException e) {
    15. System.err.println("uploaded " + uploaded + " , buffer " + buffer.length + " from total " + base64.length());
    16. } finally {
    17. in.close();
    18. this.callback.onFinish(uploaded);
    19. }
    20. }
    Alles anzeigen
    Mein buffer hat immer 2048 char's. Ich bekomme beim 2.ten durchlauf immer eine
    IndexOutOfBoundsException ? Wo ist denn der Offsetfehler?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mrt ()

  • Hi dein Fehler liegt bei der Read Methode.


    read = in.read(buffer, uploaded, buffer.length)

    der Offset „uploaded „ bezieht sich nicht auf die Datei (Stream) sondern auf dem Buffer der müsste immer „0“ sein wenn du den Buffer immer von vorne füllen willst.
    Der Offset ist beim zweiten durchlauf grösser als dein Buffer kann nicht gehen. Doku von Java Lesen.


    Eigentlich sollte „ read = in.read(buffer)“ reichen.



    Und das schreiben bitte auch so denn du Liest ein Char Array dann schreibe es auch wieder.


    sink.write(buffer, 0, read);

    noch ein link.

    code.i-harness.com/de/q/1fcb345
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • etweder du list auch ein Byte wie im original,

    oder du konvertirst es in ein Byte.

    Warum eigent lich Char?

    In Java ist ein Byte wirklich ein Byte 8Bit und ein Char meist 2Byte 16 Bit kommt auf den Zeichensatz an.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • jogimuc schrieb:

    Warum eigent lich Char?
    Weil: StringReader::Reader::read(char[] cbuf)

    ..so meckert
    Andsroid Studio mit Can not resolve read(byte[])

    Andere Frage:
    die UploadProzesse werden bei mir zweimal aufgerufen. Debug log cat:

    1. progress wird aufgerufen

    Brainfuck-Quellcode

    1. APP UPLOAD progress: 2048
    2. APP UPLOAD progress: 4096
    3. APP UPLOAD progress: 6144
    4. APP UPLOAD progress: 8192
    5. APP UPLOAD progress: 10240
    6. APP UPLOAD progress: 12288
    7. APP UPLOAD progress: 14336
    8. ....

    2. dann kommt OkHttp mit dem langen base64 String:
    D/OkHttp: _9j_4AAQSkZJRgABAQA..........
    D/OkHttp: ..........[b][/b]
    D/OkHttp: c1dfHRWx0T32bF_SiKNI6KgANzlIHQLPIVYUKHZ7sgn8G-yeAKgoHfn1FY6wLrUMPX4IQmO1tugP
    D/OkHttp: --> END POST (-1-byte body)

    3. wieder progress:

    Brainfuck-Quellcode

    1. APP UPLOAD progress: 2048
    2. APP UPLOAD progress: 4096
    3. APP UPLOAD progress: 6144
    4. APP UPLOAD progress: 8192
    5. APP UPLOAD progress: 10240
    6. APP UPLOAD progress: 12288
    7. APP UPLOAD progress: 14336
    8. ....
    Ergo der Balken läuft zweimal durch????

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mrt ()