Сайт разработчика Александр Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Погода в Уфе - а в деревне Гадюкино опять идут дожди

Идея для статьи: Пишем своё первое приложение на Android / Разработка под Android / Хабрахабр

Данная статья писалась для Android 2.3. В новых проектах для Android 3.0 и выше, приведённый код работать скорее всего не будет, так как операции, связанные с получением данных из интернета нельзя использовать в основном потоке программы.

Сегодня я расскажу о разработке одной простейшей программы 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>

Далее можно приступать к написанию кода к программе. Логика работы приложения состоит из трех пунктов:

  • Загрузить HTML-страницу со значениями температуры
  • С помощью регулярного выражения «вытащить» значение температуры
  • Показать в TextView значение температуры

Так как мы собираемся подключаться к сайту через интернет, то сначала нужно указать в манифесте соответствующее разрешение <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("°")); // отображение температуры
    };
} 

Погода в Уфе

Реклама