티스토리 뷰
기상청에서 제공하는 Json 파일을 이용하여 안드로이드에 시군구 데이터를 삽입하려 한다.
Activity 안에서 URL을 이용하여 네트워크에 연결하려고 하였을 때 에러가 발생한다.
이는 main Thread(UI Thread)에서 너무 많은 동작을 요청했기 때문인데,
해당 문제는 AsyncTask 를 이용하는 방법으로 해결할 수 있다.
아래는 내가 이용했던 기상청의 url 인데, 지역코드와 지역명이 json의 형태로 들어있다.
http://www.kma.go.kr/DFSROOT/POINT/DATA/top.json.txt
http://www.kma.go.kr/DFSROOT/POINT/DATA/mdl.시의 지역코드.json.txt
http://www.kma.go.kr/DFSROOT/POINT/DATA/leaf.군의 지역코드.json.txt
나는 지역명을 화면에 표시해야 하고 지역 코드는 다른 url들을 연결해야 했기 때문에
두 가지 모두가 필요하였고, 입력 받은 순서 또한 필요하여 자바의 collection중 하나인 LinkedHashMap을 사용하였다.
URL을 연결하고 해당 json에서 파싱한 데이터를 Map에 저장하는 AsyncTask를 아래와 같이 작성하였다.
public class URLAsyncTask extends AsyncTask<URL, Void, LinkedHashMap<String, Integer>> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected LinkedHashMap<String, Integer> doInBackground(URL... urls) {
LinkedHashMap<String, Integer> regionMap = new LinkedHashMap<String, Integer>();
try {
StringBuffer jsonHtml = new StringBuffer();
InputStream uis = urls[0].openConnection().getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(uis, "UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
jsonHtml.append(line + "\r\n");
}
br.close();
uis.close();
JSONArray jsonArray = new JSONArray(jsonHtml.toString());
for (int i = 0; i < jsonArray.length(); ++i)
{
JSONObject jsonObject = jsonArray.getJSONObject(i);
String key = jsonObject.getString("value");
Integer value = jsonObject.getInt("code");
regionMap.put(key, value);
}
return regionMap;
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
AsyncTask의 get() 메소드를 사용하여 doInBackground에서 반환해준 데이터를 가져올 수 있다.
위에서는 Map의 자료형을 사용했으니
map = asyncTask.get();
위와 같은 형태로 AsyncTask에서 작업한 데이터를 UI thread가 존재하는 곳으로 데이터를 가져올 수 있다.
시의 지역코드를 가져와 군의 지역을 확인하고 싶다면
"http://www.kma.go.kr/DFSROOT/POINT/DATA/mdl." + sidoMap.get(top.getItemAtPosition(index) + "") + ".json.txt"
위와같이 url에서 지역코드가 들어가는 부분에 map에서 지역코드를 가져와 집어 넣어주면 된다. (위의 코드에서는 스피너의 index를 가져와서 지역코드를 찾아주었음)
같은 방법으로 구의 json 또한 파싱하여 사용 할 수 있다.
'Android' 카테고리의 다른 글
Inconsistency detected 에러에 대한 의심.. (0) | 2020.01.11 |
---|---|
Single 과 Observable의 차이 (0) | 2019.12.29 |
Kakao REST API 사용하기 (2) | 2019.06.12 |
네이버 아이디 로그인 API를 사용해보자 (1) | 2018.08.08 |
다음 지도 API 기본 설정 (0) | 2018.04.23 |