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

xml파싱에 관해서 질문해요~

0 추천
public class MainActivity extends Activity {

	Document doc = null;
	ArrayList<WeatherVO> list; //현재지역 모든값 저장.
	TextView tv1;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		GetXMLTask task = new GetXMLTask();
		task.execute("http://www.kma.go.kr/XML/weather/sfc_web_map.xml");
		tv1 = (TextView) findViewById(R.id.tv1);


	}




	//private inner class extending AsyncTask
	@SuppressLint("NewApi") 
	private class GetXMLTask extends AsyncTask<String, Void, Document>{   
		HashMap<String,HashMap<String,String>> resultList = new HashMap<String,HashMap<String,String>>();
		String busan;


		protected Document doInBackground(String... urls) {
			URL url;
			try {

				//	    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
				//	    		DocumentBuilder builder =factory.newDocumentBuilder();
				//	    		Document doc = builder.parse("http://www.kma.go.kr/XML/weather/sfc_web_map.xml");


				url = new URL(urls[0]);
				DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
				DocumentBuilder db = dbf.newDocumentBuilder(); //XML문서 빌더 객체를 생성
				doc = db.parse(new InputSource(url.openStream())); //XML문서를 파싱한다.
				doc.getDocumentElement().normalize();
			} catch (Exception e) {
				Toast.makeText(getBaseContext(), "Parsing Error", Toast.LENGTH_SHORT).show();
			}
			return doc;
		}

		@Override
		protected void onPostExecute(Document doc) {
			NodeList local = doc.getElementsByTagName("local");
			if(local.getLength() > 0){

				String nodeValue = null;
				HashMap<String,String> itemMap = null;

				for(int i = 0; i < local.getLength();i++){

					Element e = (Element) local.item(i);
					nodeValue = e.getFirstChild().getNodeValue();

					itemMap = new HashMap<String,String>();
					itemMap.put("아이콘넘버", e.getAttribute("icon"));
					itemMap.put("날씨", e.getAttribute("desc"));
					itemMap.put("기온", e.getAttribute("ta"));
					if(nodeValue != null&&itemMap !=null){
						resultList.put(nodeValue, itemMap);

					}

				}//for end

				busan = resultList.get("부산").get("날씨").toString();




			} //if end
			super.onPostExecute(doc);
			/////////////////레이아웃 설정하는 구역
			tv1.setText(busan);

		}//onPostExecute end


		
	}//GetXMLTask end 

}//메인 end

일단 뻑나는데 머가 문제인지 몰르겠어요 ㅜㅜ

 


11-14 11:12:34.404: E/DataScheduler(32500): isDataSchedulerEnabled():false
11-14 11:12:34.404: W/dalvikvm(32500): threadid=11: thread exiting with uncaught exception (group=0x41839e48)
11-14 11:12:34.404: E/AndroidRuntime(32500): FATAL EXCEPTION: AsyncTask #1
11-14 11:12:34.404: E/AndroidRuntime(32500): Process: com.example.test, PID: 32500
11-14 11:12:34.404: E/AndroidRuntime(32500): java.lang.RuntimeException: An error occured while executing doInBackground()
11-14 11:12:34.404: E/AndroidRuntime(32500): at android.os.AsyncTask$3.done(AsyncTask.java:300)
11-14 11:12:34.404: E/AndroidRuntime(32500): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
11-14 11:12:34.404: E/AndroidRuntime(32500): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
11-14 11:12:34.404: E/AndroidRuntime(32500): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
11-14 11:12:34.404: E/AndroidRuntime(32500): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
11-14 11:12:34.404: E/AndroidRuntime(32500): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-14 11:12:34.404: E/AndroidRuntime(32500): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-14 11:12:34.404: E/AndroidRuntime(32500): at java.lang.Thread.run(Thread.java:841)
11-14 11:12:34.404: E/AndroidRuntime(32500): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
11-14 11:12:34.404: E/AndroidRuntime(32500): at android.os.Handler.<init>(Handler.java:200)
11-14 11:12:34.404: E/AndroidRuntime(32500): at android.os.Handler.<init>(Handler.java:114)
11-14 11:12:34.404: E/AndroidRuntime(32500): at android.widget.Toast$TN.<init>(Toast.java:351)
11-14 11:12:34.404: E/AndroidRuntime(32500): at android.widget.Toast.<init>(Toast.java:101)
11-14 11:12:34.404: E/AndroidRuntime(32500): at android.widget.Toast.makeText(Toast.java:265)
11-14 11:12:34.404: E/AndroidRuntime(32500): at com.example.test.MainActivity$GetXMLTask.doInBackground(MainActivity.java:64)
11-14 11:12:34.404: E/AndroidRuntime(32500): at com.example.test.MainActivity$GetXMLTask.doInBackground(MainActivity.java:1)
11-14 11:12:34.404: E/AndroidRuntime(32500): at android.os.AsyncTask$2.call(AsyncTask.java:288)
11-14 11:12:34.404: E/AndroidRuntime(32500): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-14 11:12:34.404: E/AndroidRuntime(32500): ... 4 more
 

 

maechanisgod (210 포인트) 님이 2014년 11월 14일 질문
maechanisgod님이 2014년 11월 14일 수정
로그캣을..올려주심이...
로그캣 올렸습니다.

제가 안드로이드 배운지 얼마 안되서 로그캣 보는법을 잘 몰라서 로그캣 보는것도
알려주셨으면 감사하겠습니다ㅠ

2개의 답변

+1 추천
 
채택된 답변
AsyncTask의 doInBackground 안에서 Handler 쓰셨네요...

 

Handler 는 Looper 와 MessageQueue 가 있어야 하는데요...

이게, Main Themad 에는 기본 Looper 가 있지만, 그 외에는 Looper 만들어서 사용해 주셔야 해요

(답글로 적기는 조금 많은 내용이네요.. Handler, Looper, MessageQueue 에 대해 알아보세요~)

 

암튼... AsyncTask 는 Main Thread 가 아니어서, 그 안에서 Handler 쓰면 저런 에러 납니다.

로그상으로 보면, 파싱에러 발생했고, Toast 의 show를 하셨는데..

Toast 의 show 메소드 내부를 뜯어보면 Handler 를 사용합니다.

일단 catch 부분의 Toast 지워보시죠~~
밍이~ (5,780 포인트) 님이 2014년 11월 14일 답변
maechanisgod님이 2014년 11월 14일 채택됨
0 추천

토스트가 문제네요

토스트는  UI 중 하나여서 스레드에서 실행 할 수 없습니다

따로 토스트 에러메시지를 출력하는 메서드를 만들고

토스트를 띄우려던 곳에서  호출하시면 될거에요

 

추가로

로그캣 보는 법은
 
에러가 나면 중간에 
 
Caused by: ~~~~
 
이렇게 시작되는 구문이 있습니다
그 구문 몇줄 밑에 보면
자신이 작성한 코드의 위치가 패키지명과 함께 출력됩니다
 
여기서는 
 
at com.example.test.MainActivity$GetXMLTask.doInBackground(MainActivity.java:64)
 
 
MainActivity.java 자바 파일의 64번째 줄에서 
com.example.test 패키지의 MainActivity 에서 GetXMLTask.doInBackground 가 에러 났다는 뜻이며  
 
그곳을 더블 클릭하면  에러난 곳으로 바로 이동할 수 있습니다
참고 바래요
psalm (1,910 포인트) 님이 2014년 11월 14일 답변
psalm님이 2014년 11월 14일 수정
...