Соединение устройства с внешним миром часто бывает очень запутанным даже
на простых примерах, благодаря огромному количеству версий ОС Android.
Официальная документация подает скупой пример работы HttpURLConnection и
при изучении мне пришлось долго разбираться с причиной не работающего
кода на устройстве с Android 6.0 взятых из разных источников. Имеющаяся
информация на форумах и блогах очень отрывистая, и не дает полного
примера работающей простой программы которая читает HTML страницы сайта.
Эта тема охватывает два вопроса: класс AsyncTask и собственно HttpURLConnection.
AsyncTask - это класс который создает отдельный поток для сложных вычислений, с ним работа идет проще чем с ранее рассмотренным Thread, так как не требует создания дополнительных классов типа Hndler и Runnable (AsyncTask создает их сам). AsyncTask - нужен для того, чтоб вынести работу с сетью в отдельный поток. Попытка установить сеть из основного потока вызовет исключение.
Для начала создадим класс HttpConnect который и будет устанавливать контакт с сайтом, а один из его методов будет принимать строку-адрес и возвращать строку с HTML кодом страницы. На данном этапе нет смысла перегружать статью описаниями обьектов и их методов которые участвуют в классе HttpConnect ( тут уже действительно можно обойтись беглым взглядом по документации). Цель статьи увидеть заветную строку 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() который вызывается после
завершении задачи в потоке, в этом методе можно свободно обращаться к
внешним объектам главной активности, и выводить в текстовые поля строки.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Комментариев нет:
Отправить комментарий