/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Идея для статьи:
Сегодня я расскажу о разработке одной простейшей программы UfaTermometer, показывающей текущую температуру с датчиков, расположенных на одном из объектов башкирской энергокомпании в городе Уфа.
Для приложения нам понадобятся кнопка для обновления показаний температуры и TextView (вывод значения температуры). Пишем код для разметки (main.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/buttonRefresh"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal|center"
android:textSize="30px"
android:padding="20px"
android:layout_marginTop="10dip"
android:text="Обновить"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="..."
android:textSize="100dip"
android:gravity="center_horizontal"
android:id="@+id/textviewTemperature"
android:textColor="#EEE3C4"
/>
</LinearLayout>
Далее можно приступать к написанию кода к программе. Логика работы приложения состоит из трех пунктов:
Так как мы собираемся подключаться к сайту через интернет, то сначала нужно указать в манифесте соответствующее разрешение <uses-permission android:name=«android.permission.INTERNET»/>. Теперь можно писать код, реализующий указанную выше логику работы:
package ru.alexanderklimov.ufatemperature;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class UfaTemperatureActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button button = (Button) findViewById(R.id.buttonRefresh);
button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View view)
{
refreshTemperature();
}
});
refreshTemperature(); // при запуске программы сразу выводим температуру
}
// фукция загрузки температуры
public String getTemperature(String urlsite)
{
String matchtemper = "";
try
{
// загрузка страницы
URL url = new URL(urlsite);
URLConnection conn = url.openConnection();
InputStreamReader rd = new InputStreamReader(conn.getInputStream());
StringBuilder allpage = new StringBuilder();
int n = 0;
char[] buffer = new char[40000];
while (n >= 0)
{
n = rd.read(buffer, 0, buffer.length);
if (n > 0)
{
allpage.append(buffer, 0, n);
}
}
// работаем с регулярным выражением
final Pattern pattern = Pattern.compile
("[^-+0]+([-+0-9]+)[^<]+[^(а-яА-ЯёЁa-zA-Z0-9)]+([а-яА-ЯёЁa-zA-Z ]+)");
Matcher matcher = pattern.matcher(allpage.toString());
if (matcher.find())
{
matchtemper = matcher.group(1);
}
return matchtemper;
}
catch (Exception e)
{
}
return matchtemper;
};
// функция обновления показаний температуры
public void refreshTemperature()
{
final TextView tTemper = (TextView) findViewById(R.id.textviewTemperature);
String bashtemp = "";
bashtemp = getTemperature("http://be.bashkirenergo.ru/weather/ufa/");
tTemper.setText(bashtemp.concat("°")); // отображение температуры
};
}