2014-09-30 13 views
12

क्या वर्ग का OkHttp का उपयोग करते समय फ़ाइल प्रगति डाउनलोड करने का कोई तरीका है?स्क्वायर ओकेएचटीपी। प्रगति डाउनलोड करें

मुझे Recipes में कोई समाधान नहीं मिला।

उनके पास कक्षा Call है जो सामग्री को असीमित रूप से प्राप्त कर सकते हैं, लेकिन वर्तमान प्रगति प्राप्त करने के लिए कोई विधि नहीं है।

उत्तर

22

ओप्स उत्तर स्पष्ट था। बेवकूफ सवाल के लिए खेद है। बस सामान्य रूप से इनपुटस्ट्रीम पढ़ने की जरूरत है।

private class AsyncDownloader extends AsyncTask<Void, Long, Boolean> { 
    private final String URL = "file_url"; 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     OkHttpClient httpClient = new OkHttpClient(); 
     Call call = httpClient.newCall(new Request.Builder().url(URL).get().build()); 
     try { 
      Response response = call.execute(); 
      if (response.code() == 200) { 
       InputStream inputStream = null; 
       try { 
        inputStream = response.body().byteStream(); 
        byte[] buff = new byte[1024 * 4]; 
        long downloaded = 0; 
        long target = response.body().contentLength(); 

        publishProgress(0L, target); 
        while (true) { 
         int readed = inputStream.read(buff); 
         if(readed == -1){ 
          break; 
         } 
         //write buff 
         downloaded += readed; 
         publishProgress(downloaded, target); 
         if (isCancelled()) { 
          return false; 
         } 
        } 
        return downloaded == target; 
       } catch (IOException ignore) { 
        return false; 
       } finally { 
        if (inputStream != null) { 
         inputStream.close(); 
        } 
       } 
      } else { 
       return false; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    @Override 
    protected void onProgressUpdate(Long... values) { 
     progressBar.setMax(values[1].intValue()); 
     progressBar.setProgress(values[0].intValue()); 

     textViewProgress.setText(String.format("%d/%d", values[0], values[1])); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     textViewStatus.setText(result ? "Downloaded" : "Failed"); 
    } 
} 
+3

वहाँ यह करने के लिए एक और अधिक सुरुचिपूर्ण रास्ता नहीं है ? OkHttpClient.newCall (अनुरोध) की तरह .notify प्रगति (कॉलबैक) ... या ऐसा कुछ ... – josketres

+0

ग्रेट उत्तर लेकिन एक और सवाल ... मैं देखता हूं कि हमारे पास इनपुटस्ट्रीम है ... फ़ाइल को पास करने के लिए हम पूरी स्ट्रीम के माध्यम से फिर से लूप करना है और इसे एक फ़ाइल में परिवर्तित करना है? क्या आप दिखा सकते हैं कि आप वास्तव में फ़ाइल ऑब्जेक्ट कैसे प्राप्त कर सकते हैं जिसे डाउनलोड किया गया है? –

+0

@MarcusGabilheri क्या आप इसके बारे में बात कर रहे हैं? http://stackoverflow.com/a/10857407/1979290 –

0

जबकि पाश में हर बार, आप progress.So प्रकाशित ऐसा अवरुद्ध किया जा रहा

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