Редактировать: Существует аннотация @Streaming
с версии Retrofit 1.6, которая может быть использована для доставки необработанного InputStream
. Может использоваться для загрузки файла.
IMO Retrofit - не лучший инструмент для загрузки файла (если только файл не содержит JSON).
Использование Retrofit (версия 2) означает, что вы используете OkHttp под капотом. OkHttp - лучший инструмент для загрузки файла.
Асинхронный получить с OkHttp выглядит следующим образом:
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
Request request = new Request.Builder()
.url("http://publicobject.com/helloworld.txt")
.build();
client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Request request, IOException throwable) {
throwable.printStackTrace();
}
@Override public void onResponse(Response response) throws IOException {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
Headers responseHeaders = response.headers();
for (int i = 0; i < responseHeaders.size(); i++) {
System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
}
System.out.println(response.body().string());
}
});
}
Больше в recipes section on Github.
Кроме того, из вики:
Метод Строка() на теле ответа является удобным и эффективным для небольших документов. Но если тело ответа велико (больше 1 MiB), избегайте string(), потому что он загрузит весь документ в память . В этом случае предпочитайте обрабатывать тело как поток.
Edit: Использование RxJava
public interface Api {
@Streaming
@GET("path to file")
Observable<ResponseBody> getFile();
}
api.getFile()
.flatMap(responseBody -> {
try {
return Observable.just(responseBody.string());
} catch (IOException e) {
return Observable.error(e);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(System.out::println);
Опять вы, вероятно, не использовать responseBody.string()
для больших файлов.
Спасибо, мне нужно обработать тело как поток. Попробуем это – Joolah
любой шанс может улучшить этот код с помощью AndroidRx? благодаря – Joolah