[안드로이드] - 비동기 AsyncTask 예제 2개
○ 비동기 AsyncTask 예제 2개 |
참고해서 사용하기 위한 예제 2개 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_weathermise); weather_url = "http://newsky2.kma.go.kr/service/ SecndSrtpdFrcstInfoService2/ForecastGrib?serviceKey=(자신의 서비스 키)&base_date="+today+"&base_time="+todaytime+"&nx=61&ny= 126&numOfRows=10&pageSize=10&pageNo=1&startPage=1&_type=xml"; System.out.println("날씨 : " + weather_url); new GetXMLTask().execute(); } private class GetXMLTask extends AsyncTask<String, Void, Document> { @Override protected Document doInBackground(String... urls) { URL url; Document doc = null; try { url = new URL(weather_url); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(new InputSource(url.openStream())); doc.getDocumentElement().normalize(); } catch (Exception e) { Toast.makeText(getBaseContext(), "Parsing Error", Toast.LENGTH_SHORT).show(); } return doc; } @Override protected void onPostExecute(Document doc) { NodeList nodeList = doc.getElementsByTagName("item"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); Element fstElmnt = (Element) node; NodeList idx = fstElmnt.getElementsByTagName("category"); // 모든 category 값들을 출력 위한 // s += "category = "+ idx.item(0).getChildNodes().item(0).getNodeValue() +"\n"; // 강수형태 PTY 없음(0), 비(1), 비/눈(2), 눈(3) if (idx.item(0).getChildNodes().item(0).getNodeValue().equals("PTY")) { NodeList gugun = fstElmnt.getElementsByTagName("obsrValue"); // s += "fcstValue 강수확률 = " + gugun.item(0).getChildNodes().item(0).getNodeValue() + "% \n"; int pty_num = Integer.parseInt(gugun.item(0).getChildNodes().item(0).getNodeValue()); if (pty_num == 0) { rainper.setText("없음"); } else if (pty_num == 1) { rainper.setText("비"); } else if (pty_num == 2) { rainper.setText("비/눈"); } else if (pty_num == 3) { rainper.setText("눈"); } System.out.println("강수형태 : " + Integer.parseInt(gugun.item(0).getChildNodes().item(0).getNodeValue())); } // 습도 REH, fcstValue 습도에 해당하는 값 if (idx.item(0).getChildNodes().item(0).getNodeValue().equals("REH")) { NodeList gugun = fstElmnt.getElementsByTagName("obsrValue"); // s += "fcstValue 습도 = " + gugun.item(0).getChildNodes().item(0).getNodeValue() + "% \n"; humi.setText(gugun.item(0).getChildNodes().item(0).getNodeValue() + "%"); } // 온도 T1H, fcstValue 온도에 해당하는 값 if (idx.item(0).getChildNodes().item(0).getNodeValue().equals("T1H")) { NodeList gugun = fstElmnt.getElementsByTagName("obsrValue"); //s += "fcstValue 온도 = " + gugun.item(0).getChildNodes().item(0).getNodeValue() + "'C \n"; temp.setText(gugun.item(0).getChildNodes().item(0).getNodeValue() + "'C"); } // 구름상태 SKY, fcstValue 구름상태에 해당하는 값 // 0~2 : 맑음, 3~5 : 구름조금, 6~8 : 구름많음, 9~10 : 흐림 if (idx.item(0).getChildNodes().item(0).getNodeValue().equals("SKY")) { NodeList gugun = fstElmnt.getElementsByTagName("obsrValue"); int cloud_num = Integer.parseInt(gugun.item(0).getChildNodes().item(0).getNodeValue()); if (cloud_num == 0 || cloud_num == 1 || cloud_num == 2) { //s += "fcstValue 하늘상태 = 맑음\n"; stat.setText("맑음"); } else if (cloud_num == 3 || cloud_num == 4 || cloud_num == 5) { //s += "fcstValue 하늘상태 = 구름 조금\n"; stat.setText("구름 조금"); } else if (cloud_num == 6 || cloud_num == 7 || cloud_num == 8) { // s += "fcstValue 하늘상태 = 구름 많음\n"; stat.setText("구름 많음"); } else if (cloud_num == 9 || cloud_num == 10) { // s += "fcstValue 하늘상태 = 흐림\n"; stat.setText("흐림"); // s += "fcstValue 하늘상태 = "+ gugun.item(0).getChildNodes().item(0).getNodeValue() +"\n"; } // 모든 카테고리에 대한 fcstValue 값들을 출력 위한 // NodeList gugun = fstElmnt.getElementsByTagName("fcstValue"); // s += "fcstValue = "+ gugun.item(0).getChildNodes().item(0).getNodeValue() +"\n"; } super.onPostExecute(doc); } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_weathermise); strUrl = "http://openAPI.seoul.go.kr:8088/(자신의 키)/xml/ListAirQualityByDistrictService/1/5/111273/"; System.out.println("미세먼지 url : " + strUrl); new DownloadWebpageTask().execute(strUrl); } private class DownloadWebpageTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... urls) { try { return (String) downloadUrl((String) urls[0]); } catch (IOException e) { return "다운로드 실패"; } } protected void onPostExecute(String result) { try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(new StringReader(result)); int eventType = xpp.getEventType(); String Gu = ""; String Grade = ""; String Mise = ""; String Chomise = ""; boolean bSet_Gu = false; boolean bSet_Grade = false; boolean bSet_Mise = false; boolean bSet_Chomise = false; while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_DOCUMENT) { ; } else if (eventType == XmlPullParser.START_TAG) { String tag_name = xpp.getName(); if (tag_name.equals("GRADE")) bSet_Grade = true; if (tag_name.equals("PM10")) bSet_Mise = true; if (tag_name.equals("PM25")) bSet_Chomise = true; } else if (eventType == XmlPullParser.TEXT) { if (bSet_Grade) { Grade = xpp.getText(); System.out.println("대기상태 : " + Grade); ecoValue.setText("대기상태 : " + Grade); String seeStat = Grade; if(seeStat.equals("좋음")){ ecoImage.setImageResource(R.drawable.ic_status_1); ecodetailtext1.setText("마스크를 안끼셔도 됩니다"); ecodetailtext2.setText("실외활동하기 좋습니다"); ecodetailtext3.setText("그래도 손은 깨끗이 씻어주세요"); ecodetailtext4.setText("환기시키기 좋습니다"); } else if(seeStat.equals("보통")){ ecoImage.setImageResource(R.drawable.ic_status_2); ecodetailtext1.setText("호흡기가 민감하면 마스크를 쓰세요"); ecodetailtext2.setText("민감군은 장시간 또는 무리한 실외 활동 자제하세요"); ecodetailtext3.setText("물이나 비타민 C가 많은 채소/과일을 섭취하세요"); ecodetailtext4.setText("환기를 되도록 자제하세요"); } else if(seeStat.equals("나쁨")){ ecoImage.setImageResource(R.drawable.ic_status_3); ecodetailtext1.setText("마스크를 껴주세요"); ecodetailtext2.setText("실외활동 및 외출을 자제하세요"); ecodetailtext3.setText("혹시 외출했다면, 깨끗이 씻으세요"); ecodetailtext4.setText("환기는 1분 내외로 해주세요"); } else if(seeStat.equals("매우나쁨")){ ecoImage.setImageResource(R.drawable.ic_status_4); ecodetailtext1.setText("마스크는 필수입니다"); ecodetailtext2.setText("실외활동 및 외출을 자제하세요"); ecodetailtext3.setText("혹시 외출했다면, 깨끗이 씻으시고 물을 많이 드세요"); ecodetailtext4.setText("환기는 1분 내외로 해주세요"); } // tv.append("stat : " + stat + "\n"); bSet_Grade = false; } if (bSet_Mise) { Mise = xpp.getText(); seeMise2.setText(Mise); System.out.println("미세먼지 : " + Mise); int numberMise = Integer.parseInt(Mise); if(numberMise <= 30) { seeMiseInfo2.setText("좋음"); } else if (numberMise <= 80) { seeMiseInfo2.setText("보통"); } else if (numberMise <= 150 ){ seeMiseInfo2.setText("나쁨"); } else { seeMiseInfo2.setText("매우나쁨"); } bSet_Mise = false; } if (bSet_Chomise) { Chomise = xpp.getText(); seeChomise2.setText(Chomise); System.out.println("초미세먼지 : " + Chomise); int numberChomise = Integer.parseInt(Chomise); if(numberChomise <= 15) { seeChomiseInfo2.setText("좋음"); } else if(numberChomise <= 50){ seeChomiseInfo2.setText("보통"); } else if (numberChomise <= 100){ seeChomiseInfo2.setText("나쁨"); }else { seeChomiseInfo2.setText("매우나쁨"); } bSet_Chomise = false; } } else if (eventType == XmlPullParser.END_TAG) { ; } eventType = xpp.next(); } } catch(Exception e){ ; } } private String downloadUrl(String myurl) throws IOException { HttpURLConnection conn = null; try { URL url = new URL(myurl); conn = (HttpURLConnection) url.openConnection(); BufferedInputStream buf = new BufferedInputStream(conn.getInputStream()); BufferedReader bufreader = new BufferedReader(new InputStreamReader(buf, "utf-8")); String line = null; String page = ""; while((line = bufreader.readLine()) != null){ page += line; } return page; } finally { conn.disconnect(); } } } |
'안드로이드' 카테고리의 다른 글
[안드로이드] - Mapbox API 이용해 지도 및 길찾기 구현하기 (1) | 2018.05.31 |
---|---|
[안드로이드] - 주소 값을 이용해 위도 경도 구하기 (0) | 2018.05.31 |
[안드로이드] - picasso로 이미지 URL 쉽게 ImageView에 띄워주기 (0) | 2018.05.24 |
[안드로이드] - CardView 에 FadeIn 애니메이션 효과주기 (0) | 2018.05.18 |
[안드로이드] - 날씨 공공데이터 DOM 파싱, 복잡한 파싱하기 (1) | 2018.05.17 |