[android wearOS] 정류장 목록 출력(Thread)(XmlPullParser)

dh·2022년 8월 7일

공공데이터포털에서 좌표기반근접정류소 목록조회의 샘플 데이터는 이러한 형식으로 되있다.

필요한 nodeid, nodenm태그를 파싱 해보기로 했다.
fusedlocationproviderclient로 얻은 좌표를 이용해 주변 정류소 목록을 얻어왔다.

public String getTagoXmlData() {
        String lat_str = Double.toString(latitude);
        String lon_str = Double.toString(longitude);
        StringBuffer buffer = new StringBuffer();

        Thread t = new Thread(() -> {

            String queryUrl = "http://apis.data.go.kr/1613000/BusSttnInfoInqireService/getCrdntPrxmtSttnList?serviceKey="
                    + "key값"
                    + "&numOfRows=10&pageNo=1&_type=xml"
                    + "&gpsLati=" + lat_str + "&gpsLong=" + lon_str;
            try {
                URL url = new URL(queryUrl);//문자열로 된 요청 url을 URL 객체로 생성.
                InputStream is = url.openStream(); //url위치로 입력스트림 연결

                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                XmlPullParser xpp = factory.newPullParser();
                xpp.setInput(new InputStreamReader(is, "UTF-8")); //inputstream 으로부터 xml 입력받기
                String tag;
                xpp.next();
                int eventType = xpp.getEventType();
                while (eventType != XmlPullParser.END_DOCUMENT) {
                    switch (eventType) {
                        case XmlPullParser.START_DOCUMENT:
                            break;

                        case XmlPullParser.START_TAG:
                            tag = xpp.getName();//테그 이름 얻어오기
                            
                            if (tag.equals("item")) ;// 첫번째 검색결과
                            else if (tag.equals("nodeid")) {
                                //buffer.append("nodeid :");
                                xpp.next();
                                //Log.d("ID",xpp.getText());
                                buffer.append(xpp.getText());//nodeid를 버퍼에 추가
                                buffer.append(",");//,문자 추가
                            } else if (tag.equals("nodenm")) {
                                //buffer.append("nodenm :");
                                xpp.next();
                                //Log.d("NM",xpp.getText());
                                buffer.append(xpp.getText());//nodenm을 버퍼에 추가
                            break;

                        case XmlPullParser.TEXT:
                            break;

                        case XmlPullParser.END_TAG:
                            tag = xpp.getName(); //테그 이름 얻어오기
                            if (tag.equals("item")) buffer.append(",");// 첫번째 item 파싱 완료, 그다음 반복...
                            break;
                    }
                    eventType = xpp.next();
                }
            } catch (Exception e) {
                // TODO Auto-generated catch blocke.printStackTrace();
            }
        });
        try {
            t.start();
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return buffer.toString();//StringBuffer 문자열 리턴
    }

Thread 사용이유

스레드를 사용 안했을 때는 파싱한결과를 얻지 못했다.
안드로이드에서 Main Thread의 주요 역할은 화면 그리기이다.
대기시간이 길어지는 네트워크 작업은 화면에 보이는 UI도 멈춤 상태로 있게 되는 문제가 생길 수 있어 무거운 작업은 Main Thread에서 하지 말아야 한다.
그래서 스레드를 이용하여 파싱을 하여 결과를 얻을 수 있었다.

https://recipes4dev.tistory.com/143?category=768056
https://brunch.co.kr/@mystoryg/84

0개의 댓글