2017-01-08 1 views
0

До сих пор я узнал, если мне нужно реализовать метод для извлечения данных из Интернета-сервера в Android приложении, это хорошо, чтобы использовать HttpURLConnection из Java следующим образом:Android: получить данные из Интернета через URL.getContent() - нет необходимости в HttpUrlConnection?

URL url = "http:\\www.stackoverflow.com/questions/json"; 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
try { 
    InputStream in = new BufferedInputStream(connection.getInputStream()); 
    readStream(in); 
    } finally { 
    connection.disconnect(); 
    } 

Но здесь YouTube люди говорят о Жарко получить Картинку просто позвонив по телефону:

InputStream in = (InputStream) url.getContent(); 

Я хотел бы отметить, что здесь мы получаем Содержание из URL без вызова HttpURLConnection.class и методы OpenConnection().

Я следовал этому учебнику и компилировал код.
1) Я что-то пропустил, или нет необходимости использовать метод HttpURLConnection.class и openConnection()?
2) Если вам не нужно, почему Android-документация рекомендует мне его использовать?

Да, я знаю, что помимо HttpURLConnection можно использовать другие пакеты (библиотеки), этот вопрос не об этом. Что я спрашиваю, почему я должен использовать любой тип соединения, если так просто получить данные, просто вызывая URL.getContent()?

ответ

0

Нельзя использовать метод HttpURLConnection.class и getConnection()?

Нет getConnection() способ. Существует openConnection(). getContent() по URL-адресу HTTP/HTTPS будет использовать openConnection() как часть его обработки, как указано в the documentation for getContent() on URL.

Почему Android-документация рекомендует мне его использовать?

Никто, кроме автора этой документации, не может сообщить вам, почему они написали эту документацию. Автор этой документации вряд ли ответит на ваш вопрос.

Лично я рекомендовал бы против использования getContent() по нескольким причинам:

  1. Он документирован и не типобезопасный, а это означает, что поведение может измениться на любом устройстве по прихоти производителя устройства ,

  2. Обработка ошибок HTTP по отношению к getContent() также недокументирована. Что произойдет, когда сервер вернет 404? A 401? 500? 301? 304? Для некоторых из них вам понадобится явная обработка (например, повторная попытка с экспоненциальным отклонением), что означает, что вам нужно получить код ответа. Как минимум, вам нужно знать, удалось ли выполнить запрос и, следовательно, будет ли любой объект-объект, который вы получаете от getContent(), будет действительным. Похоже, ваш подход не предлагает многого для этого.

  3. Аналогично, ваш подход игнорирует HTTP заголовки (запроса или ответа), такие как те, которые связаны с кэшированием (Last-Modified, ETag, Expires).

+0

Спасибо, я понял! _URL getContent() Этот метод является сокращением для: openConnection(). GetContent() _ Таким образом, в обоих примерах openConnectio() существует, поэтому различие заключается только в том, что это соединение относится к классу HttpURLConnection или относится к нему напрямую (не рекомендуется) –

+0

Могу ли я спросить о методе connect()? Почему в некоторых документах упоминается это как «HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.connect(); 'но есть много документов, которые не упоминают этот метод для использования –

+0

@ Vick.GV: IIRC,' connect() 'будет называться лениво, как только вы начнете пытаться работать с выходом (например, , вызовите 'getInputStream()'). – CommonsWare

0

Конечно, он использовал HttpURLConnection, но вместо того, чтобы он использовал connection.getInputStream()connection.getContent() который Retruns в Object экземпляр.

По документации; getContent() уже использует getInputStream() для извлечения содержимого и getContentType() для загрузки соответствующего класса (например, JSON).

Я рекомендую вам использовать getInputStream(), поскольку он позволяет обрабатывать ошибки, коды разных типов ответов и решать, какой класс использовать с этим типом данных.

также URL-адрес имеет метод, называемый getContent() whitch является сокращением для: connection.getContnet();

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