336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
안드로이드를 본격적으로 공부 하면서 한번쯤은 간단히 날씨 앱을 만들어 보고자 했습니다.
역시 처음부터 쉬운 건 없더군요ㅋ
일단 기본 골격이라던지 알고리즘은 구글링을 통해서 참고 했습니다.
참고한 사이트를 명시 해야 하는데 도통 어디서 레퍼런스 했는지 알 수가 없군요....ㅡㅡ;
일단 기본 골격에 thread쪽을 공부 하면서 message 기반으로 구현을 해 보았네요
실제 weather info를 가지고 오는 부분을 따로 thread로 나누어서 작업을 분산 시켰습니다.
아래 코드 보시면서 참고 하시면 되겠네요
차츰 업그레이드 시켜서 현재 위치를 기반으로 기상정보를 가지고 온다던지 도시 선택이 가능하게 한다는지 좀 더 신경써서 작업을 해봐야겠습니다. (UI도...^^)
역시 처음부터 쉬운 건 없더군요ㅋ
일단 기본 골격이라던지 알고리즘은 구글링을 통해서 참고 했습니다.
참고한 사이트를 명시 해야 하는데 도통 어디서 레퍼런스 했는지 알 수가 없군요....ㅡㅡ;
일단 기본 골격에 thread쪽을 공부 하면서 message 기반으로 구현을 해 보았네요
실제 weather info를 가지고 오는 부분을 따로 thread로 나누어서 작업을 분산 시켰습니다.
아래 코드 보시면서 참고 하시면 되겠네요
차츰 업그레이드 시켜서 현재 위치를 기반으로 기상정보를 가지고 온다던지 도시 선택이 가능하게 한다는지 좀 더 신경써서 작업을 해봐야겠습니다. (UI도...^^)
weather_main_view.xml
AndroidManifest.xml
CMessage.java
package com.uzooin.geon.weather; public class CMessage { public final static int MSG_WEATHER_REQUEST_INFORMATION = 0; public final static int MSG_WEATHER_RESPONSE_INFORMATION = 0; }
GeoToWeather.java
package com.uzooin.geon.weather; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import android.location.Address; import android.location.Geocoder; import com.google.android.maps.GeoPoint; public class GeoToWeather { private Geocoder geoCoder; private GeoPoint geoPoint; public GeoToWeather(Geocoder t_gc, GeoPoint t_gp) { geoCoder = t_gc; geoPoint = t_gp; } public Weather getWeather() { List tList=null; try { tList = geoCoder.getFromLocation((double)geoPoint.getLatitudeE6()/1000000, (double)geoPoint.getLongitudeE6()/1000000, 5); } catch (IOException e) { } // geocoder의 getFromLocation()을 이용하여 Reverse Geocoding(Geopoint->주소)한다. // getFromLocation()의 인자로 들어가는 latitude와 longitude는 마이크로 값이 아니므로 // 10^6을 나누어 인자로 넣어준다. Address tAddr = tList.get(0); Weather dataWeather = new Weather(); dataWeather.m_sRegion = tAddr.getLocality(); // 지역명을 가지고 온다. Geocoder 생성자의 두 번째 이자를 특정한 Locale로 주었을 경우에는 // 해당 언어로 지역명이 나온다. 영어가 Default이다. // 아래는 실제 파싱하는 부분이다. XmlPullParserFactory factory = null; try{ factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = null; xpp = factory.newPullParser(); String connectUrl = "http://www.google.co.kr/ig/api?weather=" + dataWeather.m_sRegion; // 해당 지역의 url을 설정한다. URL UrlRecWeather = null; UrlRecWeather = new URL(connectUrl); InputStream in; in = UrlRecWeather.openStream(); xpp.setInput(in, "euc-kr"); ReceiveParsing getParse = new ReceiveParsing(dataWeather); getParse.proceed(xpp); } catch(Exception ex) { } return dataWeather; } public void chageGeoPoint(GeoPoint t_gp) { geoPoint = t_gp; } // 파싱하는 클래스. 내부클래스로 삽입 class ReceiveParsing { Weather dataWeather; public ReceiveParsing(Weather t_dW) { dataWeather = t_dW; } void proceed(XmlPullParser ReceiveStream) { boolean bcurrent_condition = false; try { String sTag; int eventType = ReceiveStream.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { // Wait(10); switch (eventType) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.END_DOCUMENT: break; case XmlPullParser.START_TAG: // items.add(xpp.getAttributeValue(0)); sTag = ReceiveStream.getName(); if (sTag.equals("current_conditions")) { bcurrent_condition = true; } if (bcurrent_condition == true) { if (sTag.equals("condition")) { String sValue = ReceiveStream.getAttributeValue(0); dataWeather.m_sCurrentState = sValue; } else if (sTag.equals("temp_f")) { String sValue = ReceiveStream.getAttributeValue(0); dataWeather.m_nTempF = Integer.parseInt(sValue); } else if (sTag.equals("temp_c")) { String sValue = ReceiveStream.getAttributeValue(0); dataWeather.m_nTempC = Integer.parseInt(sValue); } else if (sTag.equals("humidity")) { String sValue = ReceiveStream.getAttributeValue(0); dataWeather.m_sHumidity = sValue; } else if (sTag.equals("wind_condition")) { String sValue = ReceiveStream.getAttributeValue(0); dataWeather.m_sWindCondition = sValue; } } break; case XmlPullParser.END_TAG: sTag = ReceiveStream.getName(); if (sTag.equals("current_conditions")) { bcurrent_condition = false; } break; case XmlPullParser.TEXT: break; } eventType = ReceiveStream.next(); } } catch (Exception e) { } } } } // 날씨 형에 관한 구조를 지니는 구조체 형 클래스 class Weather { int m_nTempF = 0; int m_nTempC = 0; String m_sRegion = "Not"; String m_sCurrentState = "Not"; String m_sHumidity = "Not"; String m_sWindCondition = "Not"; }
WeatherThread.java
package com.uzooin.geon.weather; import android.content.Context; import android.location.Geocoder; import android.os.Handler; import android.os.Looper; import android.os.Message; import com.google.android.maps.GeoPoint; public class WeatherThread extends Thread { Handler mMainHandler; Weather t_Weather; Geocoder t_Geocoder; GeoPoint t_GeoPoint; GeoToWeather gtw; Context mContext; WeatherThread (Context aContext, Handler aHandler) { this.mMainHandler = aHandler; this.mContext = aContext; t_Geocoder = new Geocoder(this.mContext); // for getFromLocation() // getFromLocation()함수를 이용하여 GeoPoint값을 지역 값으로 가져오는데 필요하다. // 오버로딩된 생성자의 두 번째 인자를 사용하여 언어 선택 가능하다(Locale). t_GeoPoint = new GeoPoint(37517292, 127037187); // location value for transform // 변환하고자 하는 GeoPoint 값이다. // http://www.mygeoposition.com/ 에서 값을 얻을 수 있다. gtw = new GeoToWeather(t_Geocoder, t_GeoPoint); } @Override public void run() { // TODO Auto-generated method stub Looper.prepare(); Looper.loop(); } public Handler mWeatherHandler = new Handler() { public void handleMessage(Message msg) { Message retMsg = Message.obtain(); switch (msg.what) { case CMessage.MSG_WEATHER_REQUEST_INFORMATION: if (gtw != null) { t_Weather = gtw.getWeather(); retMsg.what = CMessage.MSG_WEATHER_RESPONSE_INFORMATION; retMsg.obj = t_Weather; mMainHandler.sendMessage(retMsg); } break; } } }; }
MainActivity.java
package com.uzooin.geon.weather; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import android.app.Activity; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.ImageView; import android.widget.TextView; public class MainActivity extends Activity { private TextView location; private TextView date; private TextView condition; private TextView forecast; private ImageView conditionImage; //private Location mLocation = null; WeatherThread mWeatherTread; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.weather_main_view); this.location = (TextView) findViewById(R.id.view_location); this.date = (TextView) findViewById(R.id.view_date); this.condition = (TextView) findViewById(R.id.view_condition); this.forecast = (TextView) findViewById(R.id.view_forecast); this.conditionImage = (ImageView) findViewById(R.id.condition_image); mWeatherTread = new WeatherThread(this, mMainHandler); mWeatherTread.setDaemon(true); mWeatherTread.start(); RequestWeatherInfo(); } public void RequestWeatherInfo() { Message msg = Message.obtain(); msg.what = CMessage.MSG_WEATHER_REQUEST_INFORMATION; mWeatherTread.mWeatherHandler.sendMessage(msg); } Handler mMainHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case CMessage.MSG_WEATHER_RESPONSE_INFORMATION: Weather t_Weather = (Weather)msg.obj; String tStr = t_Weather.m_nTempF + "°F" +" (" + t_Weather.m_nTempC +"°C)"; SimpleDateFormat formater = new SimpleDateFormat("yyyy.MM.dd", Locale.KOREA); Date current = new Date(); String time = formater.format(current); location.setText(t_Weather.m_sRegion); date.setText(time); condition.setText(tStr); forecast.setText(t_Weather.m_sCurrentState); conditionImage.setImageResource(R.drawable.sun); break; } }; }; }
'ⓐndroid > reference' 카테고리의 다른 글
[Thread] 자바 쓰레드의 resume, suspend, stop 구현 (1) | 2011.03.09 |
---|---|
안드로이드 효과음 출력 (Creating Sound Effects in Android) (0) | 2011.03.09 |
Beginning Android Game Programming (0) | 2011.03.03 |
Android TabHost Tutorial – Part 2 (0) | 2011.01.22 |
Android TabHost Tutorial – Part 1 (0) | 2011.01.22 |