Thread와 Network를 공부하고 개념을 정리하기 전에 간단한 예제를 구현하려고 했는데, 생각지 못한 에러가 여러곳에서 발생했고, 이를 해결하다보니 게시물을 올리는 시간이 늦춰졌다.
스레드를 사용하는 이유가 통신이라 생각했고, 이를 위해 Network를 공부하면서 OpenAPI를 알게 되었고, 공공데이터를 받아서 사용하는 어플을 만들기로 결심했다.
아래의 사이트에서 다양한 공공데이터를 접할 수 있었고, 이것저것 찾아보다가 기상청의 "동네예보 조회서비스"를 가져오기로 했다.
1. 시행착오
사실 이 어플을 만드는데 3일동안 삽질을 했다. 앱 개발을 공부하면서 이렇게 오래 막혀있었던 적이 처음이라 현타가 많이왔다.....
그래서 여기저기 찾아보다가 이곳저곳에다 물어보기 시작했는데, 글로 질문하기에 한계가 있어서 질문용도로 아래 게시글을 작성했다.
이 게시물에서는 위의 질문 이후에 내가 했던 시행착오를 적어보려한다.
1) AsyncTask() 에러
위의 질문에서 문제점으로 추측한게 두가지 있었는데, 위 게시물에서의 문제점은 AsyncTask를 잘못 구현한 것이였다.
url에서 XML데이터를 parser에 넣는 작업을 doInBackground에서 했어야했는데, onPostExecute에서 작업한게 문제였다.
이 문제는 아래 블로그를 운영하시는 '뽀따'님의 도움을 받았다.
기존에 문제를 Exception.getMessage()를 통해 확인했었는데, 뽀따님이 Exception.printStackTrace()를 알려주셨고, 이를 통해 오류 메세지를 확인할 수 있었다.
2) xml 참조 에러
parser에 XML파일을 input하는데에 성공했고, parser.getName(), parser.getText()를 통해 값을 얻으려 했지만 값을 얻을 수 없었다.
그래서 혹시나 inputStream에 값은 들어갔지만 엉뚱한 값이 들어간건가 싶어서 parser.getEventType()으로 파서의 이벤트들을 모두 받아 다음과 같은 결과를 얻을 수 있었다.
여기서 EventType에 정의된 상수들은 다음을 의미한다.
0 = START_DOC
2 = START_TAG
3 = END_TAG
4 = TEXT
그래서 다음 화면을 아래 xml파일과 비교해보았고, xml파일이 제대로 들어온 것을 확인할 수 있었다.
그리고 값이 제대로 안들어가 있을수도 있다 생각되어 모든 태그값을 출력해보았다.
값을 출력해보면서 Text값은 getText, Tag값은 getName을 통해 얻어야 된다는 것을 알았다.
그리고 구글링을 해보면서 parser.next()를 통해 파서가 마치 커서처럼 움직이는 것을 알았고, getText의 값을 비교한 다음 parser.next()를 입력해야 파서가 다음으로 이동하는 것을 알게 되었다.
3) 시간값에 따른 에러
처음에는 시간값을 "20210204", "1300" 이런식으로 값으로 주어 XML을 얻고 파싱하는 기능을 구현했는데, 위의 에러를 해결하면서 실시간 날씨를 얻어보자! 하는 생각이 들었다.
그래서 Date클래스를 이용해서 실시간의 시간문자열을 얻는데에 성공했고, 실시간으로 출력하는데 성공했다.
그런데, 23시55분에는 잘 출력되던 것이 00시가 넘어가니 출력이 되지 않았다.
url링크를 통해 크롬에서 xml을 확인했는데 다음과 같이 떴다.
이를통해 시간이 변경되면서 현재시간의 날씨값이 아직 입력되지 않았다는 것을 알게되었다.
기상청에서 OpenAPI와 같이 제공하는 "오픈API활용 가이드"에서 초단기실황조회가 매시 30분에 생성되고 40분이후에 API가 제공되는 것을 알 수 있었다.
실시간의 시간문자열에서 문자열 슬라이싱을 통해 시간을 -1 해주었고, 기상청에서 제공하는 가장 최신의 날씨 API를 얻어오는데에 성공했다.
2. 결과물
좌표는 우리집을 기준으로 했다.
3. 앞으로의 목표
1) 현재 위치값을 받아 현위치의 실시간 날씨 출력하기.
2) 리사이클러뷰를 이용해서 여러개의 날씨 목록 출력하기.
3) 기상청 API에서 제공되는 위치값과 실제 GPS를 통해 받는 위도/경도 값이 단위가 다른데, 이때 값의 변환.
4) 기상청 API에서 제공되는 좌표값은 지역에 따라 총 3,770개인데 이를 처리할 방법.
5) 디자인 변경( 날씨에 따른 이미지, 커스터마이징 인터페이스 등)
'Legacy' 카테고리의 다른 글
[안드로이드 스튜디오 정리#12-2] AsyncTask (0) | 2021.02.04 |
---|---|
[안드로이드 스튜디오 정리#12-1] Thread Class (0) | 2021.02.04 |
[안드로이드 스튜디오 에러#1] XmlPullParser (0) | 2021.02.03 |
[안드로이드 스튜디오 정리#13] Network (0) | 2021.02.01 |
[안드로이드 스튜디오 정리#12] 비동기 프로그래밍 (0) | 2021.01.29 |