Категории:

  • Программирование


  • Изобразительное искусство


  • Программирование встраиваемых систем


  • Компьютерная графика


  • WEB Разработка


  • Музыка


  • Инженерия


  • iVARIOUS


  • Mobil App


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

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

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;

    public class HttpConnect {
    public static String HttpConnect(String uri)
    {
    BufferedReader reader = null;

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

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

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

    return sb.toString();

    } catch (Exception e) {
    return e.toString();
    }finally
    {
    try {
    if (reader != null)
    reader.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }


    }

    } }
    Программа проста: в поле ввода вносится адрес, и после нажатия кнопки происходит чтение HTML сайта. В класс MainActivity.java внесем следующие дополнения:

    import android.app.Activity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

    public class MainActivity extends Activity implements View.OnClickListener{
    HttpConnect htp;
    TextView textView;
    EditText editText;
    Button enter;
    HTTP_Thread mt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    htp = new HttpConnect();

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

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

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




    }
    public void onClick(View v){

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

    }



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

    protected String doInBackground(Void... params) {

    URL = htp.HttpManager(URL);

    return URL;
    }

    @Override
    protected void onPostExecute(String s) {
    super.onPostExecute(s);
    textView.setText(s);
    }

    }

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

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


    Читайте больше в категории: Mobil App

    2016-09-17 12:55:11



    Другие статьи:

    Maya. Операции Booleans

    Рисунок. Техники рисования

    STM32. Адресация регистров

    WinAPI. Изображения

    STM32. ADC (АЦП). Пример кода

    Java. Классы и Обьекты

    Android. Android.hardware.camera2. Сохранение фото

    PHP. Загрузка файлов. $_POST

    STM32. DMA - SPI - акселерометр

    PHP. Передача параметров в ссылке. $_GET