如何使用Retrofit下载和阅读文本文件,甚至更好的Rx Retrofit?
以下是改造前的完成情况示例。 真的是如何在Retrofit中转换下面的代码 样品:
try {
// Create a URL for the desired page
URL url = new URL("ksite.com/thefile.txt");
// Read all the text returned by the server
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String str;
while ((str = in.readLine()) != null) {
// str is one line of text; readLine() strips the newline character(s)
}
in.close();
} catch (MalformedURLException e) {
} catch (IOException e) {
}
我真的感谢你的帮助。谢谢
答案 0 :(得分:3)
编辑:
自版本Retrofit 1.6以来有一个@Streaming
注释,可用于传递原始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中的更多内容。
同样来自维基:
响应体上的string()方法方便快捷 小文件。但是如果响应体很大(大于1) MiB),避免使用string(),因为它会将整个文档加载到 记忆。在这种情况下,更喜欢将身体作为流进行处理。
编辑: 使用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()
来获取更大的文件。