티스토리 뷰

학교/졸업작품

날씨 업데이트 과정

사탕맛커피 2011. 8. 22. 20:39

날씨 업데이트 과정

날씨정보는 Google및 기상청의 API를 사용해서 얻을 수 있는데, Google의 API는 현재위치좌표(위도,경도)를 사용해서도 날씨를 얻을 수 있다.

날씨 업데이트 과정

업데이트 요청 –> GPS로 현재 위치좌표 확인 –> google 날씨 api에 요청 –> 
stream reader로 xml파싱  -> 현재 날씨 부분만 추출 –> 날씨 그림 표시

날씨 업데이트는 상황에 따라 시간이 걸릴 수도 있기 때문에 백그라운드에서 작업하도록 한다.

보통 handler나 thread를 사용하는데, 이 경우 UI를 업데이트 하기 어렵고, 또 UI 업데이트가 제때 되지 않았다. 대신, 안드로이드에서 제공하는 AsyncTask를 사용한다.

1 private class UpdateWeatherJob extends AsyncTask<Void, Void, String>{ 2 3 protected void onPreExecute() 4 protected void onPostExecute(String result) 5 protected String doInBackground(String... params) 6 7 } 8

이외에도 작업도중 진행도를 UI스레드로 전달하는 메소드도 있지만 여기서는 필요없다.

onPreExecute –> doInBackground –> onPostExecute순으로 진행되는데, onPreExecute와 onPostExecute에서 UI 조작을 하고 doInBackground에서 작업을 진행하면 된다.

내 현재 위치좌표는 LocationManager클래스를 생성해서 requestLocationUpdates메소드를 실행하면 얻을 수 있다. 위치를 얻은 후엔 반드시 removeUpdate메소드를 실행해주어야 한다. 그렇지 않으면 계속 위치를 업데이트 해서 배터리를 낭비할 것이다.

현재 위치를 받아오려면 requestLocationUpdates 메소드에에 등록하는 LocationListener의 onLocationChanged 메소드에서 처리해야한다.

여기서는 GeoPoint getLocationPoint()메소드를 만들 것인데, 현재 위치를 받아오려면 시간이 좀 걸리기 때문에 전역변수를 두고 리스너에서 처리가 될 ‹š까지 기다리도록 한다.

1 Location location; 2 ... 3 GeoPoint getLocationPoint(){ 4 ... 5 LocationListener locListener = new LocationListener() { 6 ... 7 public void onLocationChanged(Location _location) { 8 location = _location; 9 locMgr.removeUpdates(this); 10 } 11 ... 12 for (int i=0; i<10; i++){ 13 Thread.sleep(1000); 14 if (location != null) break; 15 } 16 ...

좀 무식한 방법 같긴 하다.

requestLocationUpdates메소드를 AsyncTask에 넣고 작업할 경우 Loop 관련 오류가 발생한다. 그래서 처음엔 Loop.prepare()를 앞에 추가해 주었더니 잘 작동은 되었으나, 해당 액티비티를 몇 번 반복 시작하면 스레드에 하나의 Loop만 있을 수 있다는 오류가 발생한다.

따라서 getLocationPoint()를 두개로 나누어 locationListener를 생성하고requestLocationUpdates를 실행하는 것 까지는 uiThread에서 실행하고, 그 이후 대기하면서 좌표를 받아오는 작업은 AsyncTask에서 실행하도록 한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함