2014-09-30 17 views

Odpowiedz

22

Oops odpowiedź była oczywista. Przepraszam za głupie pytanie. Wystarczy jak zwykle odczytać InputStream.

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

nie jest bardziej elegancki sposób to zrobić ? Podobnie jak okHttpClient.newCall (request) .notifyProgress (callback) ... lub coś w tym stylu ... – josketres

+0

Świetna odpowiedź, ale jeszcze jedno pytanie ... Widzę, że mamy inputstream ... aby przekazać to do pliku musisz ponownie przepuścić przez cały strumień i przekonwertować go do pliku? Czy możesz pokazać, jak faktycznie możesz pobrać obiekt File, który został pobrany? –

+0

@ Marcus Gabilheri o tym mówisz? http://stackoverflow.com/a/10857407/1979290 –

0

za każdym razem w pętli while, publikowania progress.So jak to jest blokowany