티스토리 뷰

기상청에서 제공하는 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 또한 파싱하여 사용 할 수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   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
글 보관함