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");
}
}
nie jest bardziej elegancki sposób to zrobić ? Podobnie jak okHttpClient.newCall (request) .notifyProgress (callback) ... lub coś w tym stylu ... – josketres
Ś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? –
@ Marcus Gabilheri o tym mówisz? http://stackoverflow.com/a/10857407/1979290 –