Search code examples
androidandroid-networkingokhttp

Square`s OkHttp. Download progress


Is there any way to get downloading file progress when using square`s OkHttp?

I did not find any solution in Recipes.

They have class Call which can get content asynchronically, but there is no method to get current progress.


Solution

  • Oops answer was obvious. Sorry for dumb question. Just need to read InputStream as usual.

    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");
        }
    }