Я знаю, что это было задано раньше, но поскольку я не смог найти ответ с окончательным заключением или, по крайней мере, одним из них, который показывает плюсы и минусы возможных подходов, я должен спросить:HttpURLConnection: Каков правильный способ чтения данных из WebService, символа или символа или строки за строкой?
Когда дело доходит до чтения данных из Интернета, например, веб-службы, какой правильный или более эффективный способ читать эти данные?
Из всех книг, которые я бросил взгляд, я нашел, по крайней мере 4 способа считывания данных:
1) Чтение определенного количества символов в то время. В этом случае данные считываются на куски из 4026 символов
BufferedReader reader = new BufferedReader(
new InputStreamReader(in, encoding));
char[] buffer = new char[4096];
StringBuilder sb = new StringBuilder();
int downloadedBytes = 0;
int len1 = 0;
while ((len1 = reader.read(buffer)) > 0) {
sb.append(buffer);
}
return sb.toString();
2) Считывание данных зная контента длины
int length =(HttpURLConnection) urlConnection.getContentLength();
InputStream inputStream = urlConnection.getInputStream();
BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder(length);
char[] buffer = new char[length];
int charsRead;
while ((charsRead = bufferedReader.read(buffer)) != -1) {
stringBuilder.append(buffer, 0, charsRead);
}
return stringBuilder.toString();
3) Считать линию передачи данных по линии:
BufferedReader reader=new BufferedReader(new InputStreamReader(c.getInputStream()));
StringBuilder buf=new StringBuilder();
String line=null;
while ((line=reader.readLine()) != null) {
buf.append(line);
}
return(buf.toString());
4) Прочитать данные по символам:
InputStream in = mConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(
in, enconding));
int ch;
StringBuilder sb = new StringBuilder();
while ((ch=reader.read()) > 0) {
sb.append((char)ch);
}
return sb.toString().trim();
Я пробовал 3 из этих 4 разных методов, за исключением номера 3 (читай данные по строкам), и из трех методов только четвертый дал мне хорошие результаты.
- Первый метод не работает для меня, потому что, когда я прочитал большое количество данных, как это часто вырезать данные, дающие мне в результате некорректных строк JSON или строку с пробелами в конце.
- Второй подход, ну, я не смог использовать этот метод, потому что getContentLength не всегда надежный, и если значение не задано, мы ничего не можем с этим поделать, ну это мой случай.
- Я не пробовал третий метод, потому что я не был уверен в том, что «строка» считывает данные «линия». Это относится к данным, содержащим массив json-объектов или только к файлам, которые действительно содержат строки?
- Будучи последней техникой последнего выбора, с которым я остался, я попробовал, и это сработало, НО Я не думаю, что чтение большого количества символов данных по характеру было бы эффективным вообще.
Так что теперь я был бы очень признателен за ваши мнения и идеи. Какой подход вы используете, когда дело доходит до чтения данных из веб-служб? и что еще более важно, почему?
Спасибо.
P.D. Я знаю, что мог бы легко использовать DefaultHttpClient, но the doc явно не рекомендует этого делать.
Для Android 2.3 (Gingerbread), а позже HttpURLConnection - лучший выбор . Его простой API и небольшие размеры делают его очень подходящим для Android. Прозрачное сжатие и ответное кэширование уменьшают использование сети, улучшают скорость и экономят аккумулятор.
Спасибо @ZInj за то, что нашли время ответить. Я знаю, что DefaultHttpClient предоставляет более простой способ чтения/записи данных, но официальный документ говорит следующее: «Для Android 2.3 (Gingerbread), а позже HttpURLConnection - лучший выбор. Его простой API и небольшие размеры делают его очень подходящим для Android. Прозрачное сжатие и ответное кэширование уменьшают использование сети, улучшают скорость и экономят батарею. Http://goo.gl/4zyIki – eddy