2012-03-16 3 views
0

서버에서 Xml을 구문 분석하려고하지만 시간이 오래 걸리고 마지막으로 NetworkOnMainThreadException이 발생합니다. 엄격 모드를 사용하고 있지만 여전히 NetworkOnMainThreadException을 나타냅니다.서버에서 XML을 구문 분석 할 때 NetworkOnMainThreadException이 발생했습니다.

업데이트 : 에뮬레이터에서 실행을 시도합니다.이 예외는 표시되지 않습니다. 실제 장치에서 응용 프로그램을 실행할 때이 예외가 표시됩니다.

XML 파싱이 내 코드 :

public class ParsingXML extends Thread{ 
      //private Context ctx; 
    private int status; 
    private String raw_url; 
    Context mctx; 
    public DefaultHandler getMyExampleHandler() { 
     return myExampleHandler; 
    } 
    DefaultHandler myExampleHandler=null; 

    public ParsingXML(Context ctx , int status){ 
      //this.ctx=ctx; 
      this.status=status; 
      this.mctx=ctx; 
      if(status==constant.GET_LIST_PRODUCT){ 
       raw_url=constant.URL+"listBarang.php"; 
      } 
    } 
    public ParsingXML(Context ctx,int status,String id){ 
     this.status=status; 
     this.mctx=ctx; 
     if(status==constant.GET_DETAIL_PRODUCT){ 
      raw_url=constant.URL+"detailBarang.php?id="+id; 
     } 
    } 
    public void parse(){  
     try { 
       StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
       StrictMode.setThreadPolicy(policy); 
       URL url = new URL(raw_url); 

       SAXParserFactory spf = SAXParserFactory.newInstance(); 
       SAXParser sp = spf.newSAXParser(); 
       XMLReader xr = sp.getXMLReader(); 

       if(status==constant.GET_LIST_PRODUCT){ 
        myExampleHandler = new ListProductHandler(); 
       } 
       else if(status==constant.GET_DETAIL_PRODUCT){ 
        myExampleHandler = new DetailProductHandler(); 
       } 
       xr.setContentHandler(myExampleHandler); 

       xr.parse(new InputSource(url.openStream())); 

     } catch (Exception e) { 
      Toast.makeText(mctx, "Connection Error", Toast.LENGTH_LONG).show(); 
     } 
       /* Display the TextView. */ 
    } 
} 

누군가가 제발 도와 수 있습니까 ?? 도움이 매우 감사합니다. :)

답변

2

네트워크 연결 및 분석 데이터에 포함 및 별도의 백그라운드 스레드에서 다른 서버 활동으로부터. 이 작업을 수행하려면 AsyncTask 클래스 호출이 있습니다. doInBackground() 메소드에 XML 읽기 코드 스니 j을 포함 시키십시오. 모든 XML 파일을 읽은 후 결과를 onPostExecute() 방법으로 표시 할 수 있습니다.

Thread 클래스 사용은 더 이상 사용되지 않습니다. 자세한 내용은 link to documentation입니다. 이 과정을 통해 NetworkOnMainThreadException에서 당신을 제거 할 수 있습니다.

+0

업데이트가 나중에 보입니다. 플랫폼 3보다 높은 장치에서 코드를 실행하고있는 것 같습니다. 인터넷 연결을 위해 백그라운드 스레드를 사용하지 않을 때는'NetworkOnMainThreadException'을 제공합니다. – AnujAroshA

+0

그래서 어떻게해야합니까 ??? 나는 스레드를 사용하고 있지만 여전히 예외를 발생시킨다. ,, – ZeeDroid

+0

스레드 클래스를 사용하지 말고 대신 AsyncTask 클래스를 사용한다. 그리고'doInBackground' 메소드에서 XML 구문 분석과 같은 모든 백그라운드 작업을 수행하십시오. – AnujAroshA

0

하면 스레드를 확장하지만, 또한 스레드 방식으로 실행 해달라고 parse 당신의 방법은, 예를 들어, run 방법에 parse 방법을 넣어주십시오

public void run(){ 
    parse(); 
} 
+0

하지만 새로운 예외를 throw합니다. 예외 : doInBackground() 실행 중 오류가 발생했습니다. 그것은 AsyncTask에서 스레드를 구문 분석하기 시작하기 때문에 Asynctask ???에서 스레드를 시작할 때 가능합니까? – ZeeDroid

+0

새로운 예외를 던지시겠습니까? – idiottiger

+0

및이 예외 : WindowManager (3494) : Activity com.portalshop.zendy.ListProductLama가 원래 여기에 추가 된 [email protected]8 창을 유출했습니다. – ZeeDroid

관련 문제