2012-01-02 4 views
0

웹 서비스를 구문 분석하고 결과를지도에 표시하려면 비동기 작업에서 다음 코드를 사용하고 있습니다 (HTC 욕망에서 실제 장치에서).웹 서비스에서 데이터를 가져 오는 동안 강제 종료/충돌 발생

protected Void doInBackground(Void... params) { 

    try { 

      /** Handling XML */ 
      spf = SAXParserFactory.newInstance(); 
      sp = spf.newSAXParser(); 
      xr = sp.getXMLReader(); 

      String response = doGet("http://www.abc.com"); 

        myXMLHandler = new MyXMLHandler(); 
      xr.setContentHandler(myXMLHandler); 
      //xr.parse(new InputSource(sourceUrl.openStream())); 
      xr.parse(new InputSource(new StringReader(response))); 

     } 
     catch (UnknownHostException e) { 
      e.printStackTrace(); 
      } 
     catch (NullPointerException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ParserConfigurationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     markerssList = MyXMLHandler.markerList; 
     mapOverlays_results =mapView.getOverlays(); 
     mapOverlays_results.remove(itemizedOverlay); 

      if(markerssList.getLatitude().size()>0) 
     { 
      Drawable drawable = HSLoc_tabActivity.this.getResources().getDrawable(R.drawable.flag); 
      itemizedOverlay = new CustomItemizedOverlay(drawable, HSLoc_tabActivity.this); 
      for (int i = 0; i < markerssList.getLatitude().size(); i++) { 

       ss1 = markerssList.getLatitude().get(i); 
       ss2 = markerssList.getLongitude().get(i); 
       ss3 = markerssList.getName().get(i); 
       ss4 = markerssList.getAddress().get(i); 
       ss5 = markerssList.getCity().get(i); 
       markerssList.getPostal_code().get(i); 

       try 
       { 
        p = new GeoPoint((int) (Double.parseDouble(ss1) * 1E6), 
          (int) (Double.parseDouble(ss2) * 1E6)); 
        overlayItem = new OverlayItem(p, " ", 
          ""+ss3+"\n"+ss4+"\n"+ss5); 
        itemizedOverlay.addOverlay(overlayItem); 

       } 
       catch(NullPointerException e1) 
       { 

       } 

      } 
      mapOverlays_results.add(itemizedOverlay); 
      //mapView.getOverlays().add(itemizedOverlay); 
      mapController = mapView.getController(); 
      mapController.animateTo(p); 
      mapController.setZoom(12); 
      mapView.postInvalidate(); 

}

코드가 낮은 네트워크 응용 프로그램의 힘에 fine..but 작동 폐쇄와 나는 그에게 다음과 같은 오류 있어요 :

 01-02 13:41:29.222: WARN/System.err(6562): java.net.UnknownHostException: www.abc.com.au 
    01-02 13:41:29.222: WARN/System.err(6562):  at java.net.InetAddress.lookupHostByName(InetAddress.java:509) 
    01-02 13:41:29.232: WARN/System.err(6562):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:297) 
    01-02 13:41:29.232: WARN/System.err(6562):  at java.net.InetAddress.getAllByName(InetAddress.java:256) 
    01-02 13:41:29.232: WARN/System.err(6562):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136) 
    01-02 13:41:29.232: WARN/System.err(6562):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
    01-02 13:41:29.232: WARN/System.err(6562):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
    01-02 13:41:29.232: WARN/System.err(6562):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359 

) 

01-02 13:41:29.312: ERROR/AndroidRuntime(6562): FATAL EXCEPTION: AsyncTask #2 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): java.lang.RuntimeException: An error occured while executing doInBackground() 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562):  at java.lang.Thread.run(Thread.java:1027) 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562): Caused by: java.lang.NullPointerException 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562):  at com.app.LocatorApp.HSLoc_tabActivity$backgroundLoadResults.doInBackground(HSLoc_tabActivity.java:545) 
01-02 13:41:29.312: ERROR/AndroidRuntime(6562):  at com.app.LocatorApp.HSLoc_tabActivity$backgroundLoadResults.doInBackground(HSLoc_tabActivity.java:1) 

이 오류를 어떻게 처리합니까?

+0

XML을 구문 분석하기 전에 응답을 보려고 했습니까? 당신은 정말로 그것을 얻고 있습니까? –

답변

1

연결을 설정할 때 예외가 발생하면 백그라운드 작업을 계속 진행하는 데 약간의 문제가있을 수 있습니다. 귀하의 catch 블록은 아마도 일종의 오류 표시를 반환합니다. 대신 그들은 쓰러지고 doInBackground이 계속 실행되어 NullPointerException이 발생합니다.

+0

즉 캐치 블록에서 작업을 취소해야한다는 의미입니까? –

+0

@nibha - 그게 내가 제안한 것입니다. 연결에 실패하면 작업을 계속하는 논리는 무엇입니까? –

관련 문제