Developer от Бога

DV

четверг, 6 июля 2017 г.

Android. HttpURLConnection. Чтение WEB HTML


Соединение устройства с внешним миром часто бывает очень запутанным даже на простых примерах, благодаря огромному количеству версий ОС Android. Официальная документация подает скупой пример работы HttpURLConnection и при изучении мне пришлось долго разбираться с причиной не работающего кода на устройстве с Android 6.0 взятых из разных источников. Имеющаяся информация на форумах и блогах очень отрывистая, и не дает полного примера работающей простой программы которая читает HTML страницы сайта.
Эта тема охватывает два вопроса: класс AsyncTask и собственно HttpURLConnection.
AsyncTask - это класс который создает отдельный поток для сложных вычислений, с ним работа идет проще чем с ранее рассмотренным Thread, так как не требует создания дополнительных классов типа Hndler и Runnable (AsyncTask создает их сам). AsyncTask - нужен для того, чтоб вынести работу с сетью в отдельный поток. Попытка установить сеть из основного потока вызовет исключение.
Для начала создадим класс HttpConnect который и будет устанавливать контакт с сайтом, а один из его методов будет принимать строку-адрес и возвращать строку с HTML кодом страницы. На данном этапе нет смысла перегружать статью описаниями обьектов и их методов которые участвуют в классе HttpConnect ( тут уже действительно можно обойтись беглым взглядом по документации). Цель статьи увидеть заветную строку HTML кода в своей первой программе. 

HttpConnect.java
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.net.HttpURLConnection;
  5. import java.net.URL;

  6. public class HttpConnect {
  7. public static String HttpConnect(String uri)
  8. {
  9. BufferedReader reader = null;

  10. try {
  11. URL url = new URL(uri);
  12. HttpURLConnection con = (HttpURLConnection) url.openConnection();

  13. StringBuilder sb = new StringBuilder();
  14. reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
  15. String line;

  16. while( (line = reader.readLine()) != null )
  17. {
  18. sb.append(line + "\n");
  19. }

  20. return sb.toString();

  21. } catch (Exception e) {
  22. return e.toString();
  23. }finally
  24. {
  25. try {
  26. if (reader != null)
  27. reader.close();
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. }


  32. }

  33. } }
Программа проста: в поле ввода вносится адрес, и после нажатия кнопки происходит чтение HTML сайта. В класс MainActivity.java внесем следующие дополнения:
  1. import android.app.Activity;
  2. import android.os.AsyncTask;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.EditText;
  7. import android.widget.TextView;

  8. public class MainActivity extends Activity implements View.OnClickListener{
  9. HttpConnect htp;
  10. TextView textView;
  11. EditText editText;
  12. Button enter;
  13. HTTP_Thread mt;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. htp = new HttpConnect();

  19. textView = (TextView) findViewById(R.id.textView);

  20. editText = (EditText) findViewById(R.id.editText);

  21. enter = (Button) findViewById(R.id.button);
  22. enter.setOnClickListener(this);




  23. }
  24. public void onClick(View v){

  25. mt = new HTTP_Thread(editText.getText().toString());
  26. mt.execute();

  27. }



  28. class HTTP_Thread extends AsyncTask <Void, Void, String>{
  29. String URL;
  30. public HTTP_Thread (String arg){ URL = arg;}

  31. protected String doInBackground(Void... params) {

  32. URL = htp.HttpManager(URL);

  33. return URL;
  34. }

  35. @Override
  36. protected void onPostExecute(String s) {
  37. super.onPostExecute(s);
  38. textView.setText(s);
  39. }

  40. }

  41. } }
Нас тут больше всего интересует класс AsyncTask, он имеет три параметра, в нашем случае это . Последний параметр указывает выходные данные так как мы хотим вернуть строку с HTML кодом. У AsyncTask есть несколько методов которые вызываются в разные периоды работы программы в новом потоке, но обязательный из них это doInBackground(), в нем и закладывается основная работа интересующей задачи. doInBackground() может конфигурироватся по разному, но нам нужно чтоб он возвращал строку с HTML кодом. Строка возвращается, но в метод onPostExecute() который вызывается после завершении задачи в потоке, в этом методе можно свободно обращаться к внешним объектам главной активности, и выводить в текстовые поля строки.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

Комментариев нет:

Отправить комментарий