Android Retrofit从服务器下载/读取文本文件

时间:2016-02-17 09:26:05

标签: java android http retrofit rx-java

如何使用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) {
}

我真的感谢你的帮助。谢谢

1 个答案:

答案 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()来获取更大的文件。