2012-05-18 7 views
-1

이 코드에서 예외가 발생합니다. 이 문제를 해결하는 방법을 모르겠습니다.Android에서 XML 파싱 : 예외 받기

내가 같이 얻고 로그 캣에서
package com.new_xml_parse; 
import java.net.URL; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
public class New_xml_parseActivity extends Activity 
{ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
super.onCreate(savedInstanceState); 
/** Create a new layout to display the view */ 
LinearLayout layout = new LinearLayout(this); 
layout.setOrientation(1); 
/** Create a new textview array to display the results */ 
TextView name[]; 
TextView website[]; 
TextView category[]; 
try 
{ 
URL url = new URL("http://bestpropertyworld.com/MobileApp/xml1.xml"); 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(new InputSource(url.openStream())); 
doc.getDocumentElement().normalize(); 
NodeList nodeList = doc.getElementsByTagName("item"); 
/** Assign textview array lenght by arraylist size */ 
name = new TextView[nodeList.getLength()]; 
website = new TextView[nodeList.getLength()]; 
category = new TextView[nodeList.getLength()]; 
for (int i = 0; i < nodeList.getLength(); i++) 
{ 
Node node = nodeList.item(i); 
name[i] = new TextView(this); 
website[i] = new TextView(this); 
category[i] = new TextView(this); 
Element fstElmnt = (Element) node; 
NodeList nameList = fstElmnt.getElementsByTagName("name"); 
Element nameElement = (Element) nameList.item(0); 
nameList = nameElement.getChildNodes(); 
name[i].setText("Name = "+ ((Node) nameList.item(0)).getNodeValue()); 
NodeList websiteList = fstElmnt.getElementsByTagName("website"); 
Element websiteElement = (Element) websiteList.item(0); 
websiteList = websiteElement.getChildNodes(); 
website[i].setText("Website = "+ ((Node) websiteList.item(0)).getNodeValue()); 
category[i].setText("Website Category = "+ websiteElement.getAttribute("category")); 
layout.addView(name[i]); 
layout.addView(website[i]); 
layout.addView(category[i]); 
} 
} 
catch (Exception e) 
{ 
System.out.println("XML Pasing Excpetion = " + e); 
} 
/** Set the layout view to display */ 
setContentView(layout); 
} 
} 

, 어떤이 만드는 당신이 가져 오는하고 주 스레드에서 XML을 구문 분석됩니다 (UI 스레드)을 의미합니다 귀하의 오류가 NetworkOnMainThreadException 인이

05-18 15:16:00.132: W/WindowManager(77): Failure taking screenshot for (180x300) to layer 21010 
05-18 15:16:00.151: W/NetworkManagementSocketTagger(77): setKernelCountSet(10013, 1) failed with errno -2 
05-18 15:16:00.681: I/Process(77): Sending signal. PID: 187 SIG: 3 
05-18 15:16:00.698: I/dalvikvm(187): threadid=3: reacting to signal 3 
05-18 15:16:01.151: I/dalvikvm(187): Wrote stack traces to '/data/anr/traces.txt' 
05-18 15:16:02.121: W/NetworkManagementSocketTagger(77): setKernelCountSet(10041, 0) failed with errno -2 
05-18 15:16:02.902: D/dalvikvm(187): GREF has increased to 201 
05-18 15:16:03.573: D/dalvikvm(187): GC_FOR_ALLOC freed 594K, 6% free 11501K/12167K, paused 114ms 
05-18 15:16:03.601: I/dalvikvm-heap(187): Grow heap (frag case) to 12.399MB for 1157776-byte allocation 
05-18 15:16:03.851: D/dalvikvm(187): GC_CONCURRENT freed 23K, 6% free 12608K/13319K, paused 25ms+7ms 
05-18 15:16:04.087: D/dalvikvm(187): GC_FOR_ALLOC freed 1K, 6% free 12608K/13319K, paused 67ms 
05-18 15:16:04.101: I/dalvikvm-heap(187): Grow heap (frag case) to 13.524MB for 1203064-byte allocation 
05-18 15:16:04.251: D/dalvikvm(187): GC_CONCURRENT freed 0K, 6% free 13783K/14535K, paused 18ms+7ms 
05-18 15:16:04.491: D/dalvikvm(187): GC_FOR_ALLOC freed 4K, 6% free 13780K/14535K, paused 49ms 
05-18 15:16:04.501: I/dalvikvm-heap(187): Grow heap (frag case) to 14.625MB for 1157776-byte allocation 
05-18 15:16:04.561: D/dalvikvm(187): GC_FOR_ALLOC freed 0K, 5% free 14911K/15687K, paused 58ms 
05-18 15:16:05.971: D/dalvikvm(187): GC_FOR_ALLOC freed 56K, 4% free 16198K/16839K, paused 57ms 
05-18 15:16:06.411: D/dalvikvm(187): GC_FOR_ALLOC freed 16K, 4% free 17678K/18311K, paused 79ms 
05-18 15:16:07.231: D/dalvikvm(187): GC_CONCURRENT freed 614K, 4% free 19055K/19847K, paused 6ms+8ms 
05-18 15:16:07.391: I/ActivityManager(77): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.new_xml_parse/.New_xml_parseActivity} from pid 187 
05-18 15:16:07.391: W/WindowManager(77): Failure taking screenshot for (180x300) to layer 21005 
05-18 15:16:07.474: W/NetworkManagementSocketTagger(77): setKernelCountSet(10041, 1) failed with errno -2 
05-18 15:16:07.637: I/System.out(572): XML Pasing Excpetion = android.os.NetworkOnMainThreadException 
05-18 15:16:08.023: I/Process(77): Sending signal. PID: 572 SIG: 3 
05-18 15:16:08.031: I/dalvikvm(572): threadid=3: reacting to signal 3 
05-18 15:16:08.372: I/dalvikvm(572): Wrote stack traces to '/data/anr/traces.txt' 
05-18 15:16:08.591: I/Process(77): Sending signal. PID: 572 SIG: 3 
05-18 15:16:08.591: I/dalvikvm(572): threadid=3: reacting to signal 3 
05-18 15:16:08.611: I/dalvikvm(572): Wrote stack traces to '/data/anr/traces.txt' 
05-18 15:16:08.735: I/ActivityManager(77): Displayed com.new_xml_parse/.New_xml_parseActivity: +1s260ms 
05-18 15:16:09.191: W/NetworkManagementSocketTagger(77): setKernelCountSet(10013, 0) failed with errno -2 
05-18 15:16:09.224: W/InputManagerService(77): Starting input on non-focused client [email protected] (uid=10013 pid=187) 
05-18 15:16:09.621: D/dalvikvm(187): GC_FOR_ALLOC freed 2277K, 12% free 18638K/21127K, paused 79ms 
05-18 15:16:34.761: D/dalvikvm(172): GC_CONCURRENT freed 387K, 6% free 9534K/10119K, paused 7ms+4ms 

답변

1

주 스레드 cant는 XML 구문 분석을 처리합니다. 따라서 AsyncTask을 사용하여 XML 구문 분석을 완료하십시오.

See this Example

+0

thaks yar. 하지만 난 어디 비동기 작업을 사용하는 knw, 안드로이드에 neew 이후 .. 분명히 .. 전화 명확하게 .. 와트 수 있습니다. 지금은 할 수 ... –

+0

신중하게이 예제를 참조하십시오 ... –

+0

너무 lenthy code .. 내가 동일한 plz에 대한 간단한 코드를 가질 수 .. 이해하기가 매우 어렵다 .. 다시 한 번 감사드립니다. –

0

에 대한 솔루션을 제공 부여 그것은 반응이 없습니다. 을 사용하여 백그라운드에서 장기간 작업을 수행하고 완료시 UI를 채우는 방법을 이해하려면 Painless Threading을 참조하십시오.

+0

와트 내가 UI에서 .. 이후 나는 안드로이드에 대한 새로운 .. 나는 명확하게 할 수 없습니다. .. uplz 전화를 자세히 .. 할 수있어 .. 내가 가진이 1 가지에서 .. 나는 사용해야합니다. AsyncTask ..하지만 내가 어떻게 그리고 어디서 .. 내가 새로운 클래스를 만들어야하는지 모르겠다 ?? 이 plz에서 나를 도우십시오. .. 이전의 하나 주셔서 감사합니다. –

0

이러한 종류의 작업을 위해 안드로이드에서 UI 스레드를 차단하는 것은 좋지 않기 때문에 네트워킹 기능을 배경으로해야한다고보고합니다.

new FetchXMLAsyncTask.execute(); 

private class FetchXMLAsyncTask extends AsyncTask<Void, Void, Void> { 
     protected void onPreExecute() { 
      } 
      @Override 
      protected Void doInBackground(Void... arg0) { 
       // put your code here where you should fetch xml, parse it and call update ui components. 
       return null; 
      } 

     @Override 
     protected void onPostExecute(final Void unused) { 

     } 
     } 
    } 
+0

나는 이것을 명확하게 얻을 수 없습니다. 자세히 .. 전화를 할 수 있습니다.이 1 가지에서 얻은 것은 .. 저는 AsyncTask를 사용해야합니다. 하지만 나는 어떻게 그리고 어디서 새로운 클래스를 만들어야하는지 모른다. ?? 이 PLZ에서 나를 도우십시오 .. 이전 한 주셔서 감사합니다 .. –

+0

어떻게 할 tat .. 내부 클래스 r 와트 내가 할 수 있습니다 .. doInBackground 메서드에서 내가 놓아야 할 코드 knw .. –

0

당신이 아래 그림과 같이 AsyncTask를를 사용해야 당신이 점점 오류가이 문제를 피하기 위해 주() 스레드에서 실행되는 서버 활동에 의한 것으로 보인다.

다음 코드는 oncreate() 또는 onclicklistener 또는 XMLPARSING CODE를 배치 한 위치에 붙여 넣으십시오. 주어진 DoXMLParsing 아래

new DoXMLParsing().execute(); 

배경 동작들을 수행 스레드 및/또는 처리기를 조작 할 필요없이 UI 스레드에 결과를 게시 AsyncTask를 확장하는 내부 클래스이다. 아래 클래스를 복사하여 XMLPARSING을 수행해야하는 활동 클래스에 붙여 넣기 만하면됩니다.

public class DoXMLParsing extends AsyncTask<Void, Void, Void> { 


protected void onPreExecute() { 
    //any task if you would like to perform before exe the XMLPARSING place the code here 
    } 


    @Override 
    protected Void doInBackground(Void... params) { 

     //cut and paste your whole XMLPARSING code here.. 

     return null; 
     } 

protected void onPostExecute(Void result) { 

    // Here if you wish to do future process for ex. move to another activity do here 

    } 
} 

호프 This Helps .. !! :)