2016-02-20 8 views
9

अपलोड मैं वी 2 नहीं बल्कि v3 के लिए जवाब पा सकते हैं की तरह thisOKHTTP 3 ट्रैकिंग मल्टीपार्ट OkHttp व्यंजनों से एक नमूना मल्टीपार्ट अनुरोध OkHttp 3 में मैं अपलोड की प्रगति को ट्रैक कर सकते कैसे प्रगति

,

private static final String IMGUR_CLIENT_ID = "..."; 
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); 

private final OkHttpClient client = new OkHttpClient(); 

public void run() throws Exception { 
    // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image 
    RequestBody requestBody = new MultipartBody.Builder() 
      .setType(MultipartBody.FORM) 
      .addFormDataPart("title", "Square Logo") 
      .addFormDataPart("image", "logo-square.png", 
        RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png"))) 
      .build(); 

    Request request = new Request.Builder() 
      .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID) 
      .url("https://api.imgur.com/3/image") 
      .post(requestBody) 
      .build(); 

    Response response = client.newCall(request).execute(); 
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 

    System.out.println(response.body().string()); 
} 
+0

में चले गए किया जाना चाहिए 'OkHttp3' नमूनों में एक नुस्खा नहीं है चाहता हूँ। यह दिखाता है कि डाउनलोड की प्रगति कैसे दिखाना है। यदि आप इसे देखते हैं तो आप एक अपलोड प्रगति मॉनिटर बनाने में सक्षम हो सकते हैं। इसे यहां खोजें https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/Progress.java –

उत्तर

10

आप लिखते समय लिखे गए बाइट्स की संख्या गिनने के लिए अपने ओकेएचटीपी अनुरोध निकाय को सजाने के लिए तैयार कर सकते हैं; इस कार्य को पूरा करने के लिए, श्रोता और वोला के उदाहरण के साथ इस अनुरोध में अपने मल्टीपार्ट अनुरोधबॉडी को लपेटें!

public class ProgressRequestBody extends RequestBody { 

    protected RequestBody mDelegate; 
    protected Listener mListener; 
    protected CountingSink mCountingSink; 

    public ProgressRequestBody(RequestBody delegate, Listener listener) { 
     mDelegate = delegate; 
     mListener = listener; 
    } 

    @Override 
    public MediaType contentType() { 
     return mDelegate.contentType(); 
    } 

    @Override 
    public long contentLength() { 
     try { 
      return mDelegate.contentLength(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return -1; 
    } 

    @Override 
    public void writeTo(BufferedSink sink) throws IOException { 
     mCountingSink = new CountingSink(sink); 
     BufferedSink bufferedSink = Okio.buffer(mCountingSink); 
     mDelegate.writeTo(bufferedSink); 
     bufferedSink.flush(); 
    } 

    protected final class CountingSink extends ForwardingSink { 
     private long bytesWritten = 0; 
     public CountingSink(Sink delegate) { 
      super(delegate); 
     } 
     @Override 
     public void write(Buffer source, long byteCount) throws IOException { 
      super.write(source, byteCount); 
      bytesWritten += byteCount; 
      mListener.onProgress((int) (100F * bytesWritten/contentLength())); 
     } 
    } 

    public interface Listener { 
     void onProgress(int progress); 
    } 
} 
अधिक के लिए

चेक this link

+1

@ सौरभ लिखने() विधि को कई बार एक बार कहा जाता है कभी-कभी धीमी नेटवर्क। तो वास्तविक% 100% से अधिक है। क्या आपको इस समस्या का सामना करना पड़ा है? – geekoraul

+0

वास्तव में, "कई बार" से आपका क्या मतलब है? कितनी बार? 3-4 या 40-60? – Sourabh

+0

वैसे यह एक निश्चित संख्या नहीं है, जैसा कि मैंने उल्लेख किया है, यह नेटवर्क पर निर्भर करता है। तो कहें कि कुल% 115% कभी-कभी पहुंचता है और कभी-कभी यह 400% तक पहुंच जाता है। सवाल यह है कि क्या आपने इस व्यवहार का सामना किया है? – geekoraul

0

सौरभ के जवाब के अनुसार, मैं CountingSink

private long bytesWritten = 0; 

की है कि क्षेत्र बता ProgressRequestBody वर्ग

+0

क्यों, जब आप 'गिनती सिंक' कक्षा के अंदर थे तो आपको किसी भी बग का सामना करना पड़ा? – Sourabh

+0

मैंने एंड्रॉइड पर इस कोड का परीक्षण किया है। Listener.onProgress() से आने वाले गलत क्रम में थे: 0, 1, 2, 0, 1, 2 और फिर मुझे यह अपवाद मिला है: java.net.SocketException: sendto विफल: ECONNRESET (कनेक्शन रीसेट सहकर्मी) एंड्रॉइड.system.ErrnoException के कारण: प्रेषण विफल: ECONNRESET ECONNRESET (सहकर्मी द्वारा कनेक्शन रीसेट) –

संबंधित मुद्दे