Главная страница

моб разраб. Лабораторные работы с 1 по 21. Лабораторная работа Использование значений строк и цветов


Скачать 5.49 Mb.
НазваниеЛабораторная работа Использование значений строк и цветов
Анкормоб разраб
Дата05.03.2022
Размер5.49 Mb.
Формат файлаdocx
Имя файлаЛабораторные работы с 1 по 21.docx
ТипЛабораторная работа
#383909
страница20 из 20
1   ...   12   13   14   15   16   17   18   19   20

Использование интернет-сервисов


Помимо простого отображения web-контента с помощью виджета WebView, разработчик имеет возможность «низкоуровневой работы с разнообразными сетевыми сервисами. Для этого всего лишь требуется создать сетевое подключение (запрос к серверу), получить, обработать и отобразить данные к нужном виде. Традиционно наиболее удобными форматами для сетевого обмена данными считаются XML и JSON.

Разумеется, любое приложение, использующее сетевые подключения, должно иметь в Манифесте соответствующие полномочия:

<uses-permission android:name="android.permission.INTERNET"/>
Для создания потока данных от сервера можно использовать класс HttpUrlConnection, являющийся расширением класса UrlConnection из пакета java.net. Пакеты java.net и android.net содержат классы, позволяющие управлять сетевыми соединениями. Более подробную информацию о классе HttpUrlConnection с примерами использования можно получить здесь: http://developer.android.com/reference/java/net/HttpURLConnection.html

Простой пример создания соединения:

private static final String some_url = " ";

. . . .

try {

// Создаем объект типа URL

URL url = new URL(getString(R.string.rates_url));
// Соединяемся

HttpURLConnection httpConnection = (HttpURLConnection) url

.openConnection();
// Получаем код ответа

int responseCode = httpConnection.getResponseCode();
// Если код ответа хороший, парсим поток(ответ сервера)

if (responseCode == HttpURLConnection.HTTP_OK) {

// Если код ответа хороший, обрабатываем ответ InputStream in = httpConnection.getInputStream();

} else {

// Сделать извещения об ошибках, если код ответа нехороший

}
} catch (MalformedURLException e) { e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}


Лабораторная работа «Использование сетевых сервисов»

Целью данной работы является создание простого приложения, получающего курсы иностранных валют по отношению к рублю с сайта ЦБ РФ в формате XML и отображающего данные в виде списка (ListView). Для получения данных будет использоваться URL http://www.cbr.ru/scripts/XML_daily.asp

Ответ сервера выглядит примерно так:





036

AUD

1

Австралийский доллар

30,4632



. . . . . . . .


Для каждой валюты (элемент Valute) потребуется извлечь значения дочерних элементов CharCode, Nominal, Name и Value. Значение атрибута Date корневого элемента (ValCurs) будет использоваться для изменения заголовка приложения.

    1. Создайте новый проект CurrencyRates. Главная (и единственная) Активность с таким же именем (CurrencyRates) должна расширять класс ListActivity.

    2. Отредактируйте Манифест приложения, добавив в него необходимые полномочия и тему для Активности (android:theme="@android:style/Theme.Light").

    3. Файл строковых ресурсов strings.xml каталоге res/values) отредактируйте следующим образом:

"1.0" encoding="utf-8"?>



<string name="app_name">Курсы ЦБ РФstring>

"rates_url">http://www.cbr.ru/scripts/XML_daily.asp




    1. Для отображения информации требуется создать разметку для элементов списка. В каталоге res/layout создайте файл item_view.xml со следующим содержимым:

"1.0" encoding="utf-8"?>

"http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"

android:orientation="horizontal" >

android:id="@+id/charCodeView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#FF8" android:minWidth="45sp" android:padding="4dp" android:textColor="#00F" android:textStyle="bold" android:gravity="center" android:shadowDx="8" android:shadowDy="8" android:shadowColor="#000" android:shadowRadius="8"/>

android:id="@+id/valueView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#008" android:background="#FFE" android:minEms="3" android:padding="3dp" />

android:id="@+id/nominalView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dp" />

android:id="@+id/nameView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="marquee" android:singleLine="true" />



    1. Вся логика приложения будет сосредоточена в классе CurrencyRates, поэтому остальные изменения будут касаться только этого класса. Добавьте необходимые

константы:

private final static String KEY_CHAR_CODE= "CharCode"; private final static String KEY_VALUE= "Value"; private final static String KEY_NOMINAL= "Nominal"; private final static String KEY_NAME= "Name";


    1. Тело метода onCreate должно содержать только две строки:

super.onCreate(savedInstanceState); populate();

Поскольку CurrencyRates является наследником ListActivity, вызов setContentView не требуется. Метод populate будет наполнять ListView содержимым с помощью адаптера (SimpleAdapter), заполнив его данными, полученными от метода getData.

    1. Добавьте метод populate, в котором создается и настраивается адаптер:

private void populate() {

ArrayList> data = getData();
String[] from = { KEY_CHAR_CODE, KEY_VALUE, KEY_NOMINAL, KEY_NAME};

int[] to = { R.id.charCodeView, R.id.valueView, R.id.nominalView, R.id.nameView};
SimpleAdapter sa = new SimpleAdapter(this, data, R.layout.item_view, from, to);
setListAdapter(sa);

}

    1. Добавьте метод getData. Именно в нем будет создаваться и обрабатываться соединение с сервером, а также анализироваться XML-данные и заполняться список, который будет отображаться адаптером. Метод getData объемнее остальных, но ничего сложного в нем нет (стоит отметить, что интерфейсы Document, Elementи NodeListдолжны импортироваться из пакета org.w3c.dom):


private ArrayList> getData() { ArrayList> list =

new ArrayList>();

Map m;
try {

// Создаем объект URL

URL url = new URL(getString(R.string.rates_url));
// Соединяемся

HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
// Получаем от сервера код ответа

int responseCode = httpConnection.getResponseCode();
// Если код ответа хороший, парсим поток(ответ сервера),

// устанавливаем дату в заголовке приложения и

// заполняем list нужными Map'ами

if (responseCode == HttpURLConnection.HTTP_OK) { InputStream in = httpConnection.getInputStream(); DocumentBuilderFactory dbf = DocumentBuilderFactory

.newInstance();

DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse(in);

Element docElement = dom.getDocumentElement(); String date = docElement.getAttribute("Date"); setTitle(getTitle() + " на " + date);
NodeList nodeList = docElement

.getElementsByTagName("Valute");
int count = nodeList.getLength();

if (nodeList != null && count > 0) {

for (int i = 0; i < count; i++) {

Element entry = (Element) nodeList.item(i); m = new HashMap();
String charCode = entry

.getElementsByTagName(KEY_CHAR_CODE)

.item(0).getFirstChild().getNodeValue();
String value = entry

.getElementsByTagName(KEY_VALUE)

.item(0).getFirstChild().getNodeValue();
String nominal = "за " + entry

.getElementsByTagName(KEY_NOMINAL)

.item(0).getFirstChild().getNodeValue();
String name = entry

.getElementsByTagName(KEY_NAME)

.item(0).getFirstChild().getNodeValue();
m.put(KEY_CHAR_CODE, charCode); m.put(KEY_VALUE, value); m.put(KEY_NOMINAL, nominal); m.put(KEY_NAME, name);
list.add(m);

}

}

} else {

// Сделать извещения об ошибках, если код ответа

// нехороший

}
} catch (MalformedURLException e) { e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (ParserConfigurationException e) { e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

}
return list;

};


    1. Проверьте работоспособность приложения. В реальной программе следует

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

«замораживать» интерфейс пользователя. Эти темы будут рассмотрены во втором курсе.




1   ...   12   13   14   15   16   17   18   19   20


написать администратору сайта