마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

파싱 중 무엇이 문제인지 감이 잡히지 않습니다.

0 추천

//---------------------------------------------------------------------------------------------------------//
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy =
                    new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
//---------------------------------------------------------------------------------------------------------//

        list = (ListView)findViewById(R.id.listview);
        mntdataList = new ArrayList<String>();
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mntdataList);
        list.setAdapter(adapter);

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(getApplicationContext(),Test.class);
                intent.putExtra("Height",mntHeight);
                startActivityForResult(intent,0);
            }
        });

//----------------------------------------------------------------------------------------------------------


        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v){
                adapter.clear(); //어뎁터,리스트를 초기화시켜 새로운 데이터를 받음
                mntdataList.clear();
                adapter.notifyDataSetChanged();
                NetworkThread thread = new NetworkThread();
                thread.start();
            }
        });
    }


    class NetworkThread extends Thread{
        public void run(){
            call();
        }
    }

    Handler handler = new Handler(){
        public void handleMessage(Message msg){
            if(msg.what ==0){
                adapter.notifyDataSetChanged();
            }
        }
    };

    public void call(){
        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL(addr);
            urlConnection = (HttpURLConnection) url.openConnection(); //url 연결
            InputStream in = urlConnection.getInputStream();	//url내용을 비트형으로읽어옴
            InputStreamReader isr = new InputStreamReader(in); // 뭐더라 다시 리더로 변환해주는과정
            BufferedReader buf = new BufferedReader(isr);		//줄단위로 읽어주기위해 실행
            sb = new StringBuffer();	//buf의 한줄 한줄 값을 입력받아 한꺼번에 출력시키기 위해 사용

            while (true) {
                readLine = buf.readLine();
                if (readLine == null) //읽어올 값이 없으면
                    break;			//멈춤 그렇지않으면
                sb.append(readLine);	//스트링버퍼에 리드라인 내용 계속 추가
                sb.append("\n");		//이게없으면 줄바꿈이없어서 알아보기가힘듦. buf의 줄바꿈단위마다 실행
            }
            tv = sb.toString();
            parsing();

            //handler.sendEmptyMessage(0); //핸들러호출
        }
        catch (Exception e) {
        }
        finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }}}

    public void parsing(){
        try{
            factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            xpp = factory.newPullParser();
            xpp.setInput(new StringReader (tv.trim()));
            eventType = xpp.getEventType();

            while (eventType != XmlPullParser.END_DOCUMENT){ //최초 title테그안에 쓸데없는 내용이 있어서 추가해줬음.
                if(eventType == XmlPullParser.START_TAG){             //ex)RSS 한경닷컴어쩌구저쩌구 제목과상관없는내용
                    String tagName2 = xpp.getName();
                    if(tagName2.equals("gdTrailInfo")){		//아이템 테그 이후부터 검색시작
                        while (eventType != XmlPullParser.END_DOCUMENT){
                            if(eventType == XmlPullParser.START_TAG){ //스타트테그를 만나면 테그값 저장
                                tagName = xpp.getName();
                            }
                            else if(eventType == XmlPullParser.TEXT){ //스타트테그가 아니라 텍스트일경우
                                if(tagName!=null){						//텍스트가 쓰래기값인경우를 배제
                                    if(tagName.equals("mntNm")){		//필요한건 타이틀과 본문이기때문에 스타트테그는 타이틀일때 실행
                                        mntNm = xpp.getText().trim();
                                        if (mntNm.length() > 0) {		//여기도 한경닷컴특성상 제목 \n 공백 \n 제목 이런식으로돼있어서 추가
                                            mntdataList.add(mntNm);
                                        }
                                    }else if(tagName.equals("mntHeight")){
                                        mntHeight = xpp.getText().trim();
                                    }
                                }
                            }
                            eventType = xpp.next();
                        }}}
                eventType = xpp.next();
            }
        }catch (Exception e){
        }
    }
    }

XmlPullParser를 통해서 api에 접근해서 ListView로 뽑아오는 코드입니다.

에러같은 건 하나도 없는데요

mntNm이 ListView에 뜨지 않습니다... 

그래서 데이터가 제대로 파싱되지 않았나 했었는데 다른 어플을 만지다가 확인해보니 또 리스트가 나와있더군요

제가 원하는 데이터들만 나와있었습니다.

그러고 나서 버튼을 눌러 다시 파싱을 시작하니까 리스트가 다 사라지면서 다시 나타나질 않습니다.

이제 막 안드로이드를 공부하고 있어서 너무 어렵네요 ㅠㅠ

익명사용자 님이 2015년 5월 23일 질문
이것저것 건드리다 보니 Thread를 사용하지 않고 메인문에서 바로 call을 호출하니 리스트에 뜨는 것을 확인했습니다.
스레드를 사용하는 것이랑 메인에 사용하는것이랑 차이가 뭔지 모르겠네요..

1개의 답변

0 추천
코딩에 답이 있군요
 
adapter.clear(); //어뎁터,리스트를 초기화시켜 새로운 데이터를 받음
mntdataList.clear();
adapter.notifyDataSetChanged();
NetworkThread thread = new NetworkThread();
thread.start();
 
버튼 클릭시 이 부분이 호출되는거 같은데
스레드 안에서 돌고있는 부분이 파싱하는 부분이라면 스레드를 다 돌고(파싱후) 
최종적으로 adapter.notifyDataSetChanged(); 호출해야 정상적으로 리스트가 갱신됩니다.
컵받침 (5,500 포인트) 님이 2015년 5월 26일 답변
...