2016-02-17 3 views
0

Как загрузить и прочитать текстовый файл с помощью «Дооснащения» или даже лучше Rx Retrofit?Android 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

Редактировать: Существует аннотация @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() для больших файлов.

+0

Спасибо, мне нужно обработать тело как поток. Попробуем это – Joolah

+1

любой шанс может улучшить этот код с помощью AndroidRx? благодаря – Joolah

Смежные вопросы