Square`s OkHttp. Download progress
使用Square的OkHttp时,有什么方法可以下载文件吗?
我在食谱中找不到任何解决方案。
他们有Call类,可以异步获取内容,但是没有获取当前进度的方法。
糟糕的答案很明显。 对不起,愚蠢的问题。 只需照常读取InputStream即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 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"); } } |
您可以使用okHttp receipe:Progress.java
每次在while循环中,您都发布进度。这就像被阻止一样