Есть ли способ загрузить файл при использовании квадратных OkHttp?
Я не нашел решения в Recipes.
У них есть класс Call, который может получать контент асинхронно, но нет способа получить текущий прогресс.
Есть ли способ загрузить файл при использовании квадратных OkHttp?
Я не нашел решения в Recipes.
У них есть класс Call, который может получать контент асинхронно, но нет способа получить текущий прогресс.
Ответ был очевиден. Извините за немой вопрос. Просто нужно прочитать 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");
}
}
каждый раз в цикле while вы публикуете прогресс. Таким образом, он блокируется
Вы можете использовать okHttp receipe: Progress.java