2016-04-11 9 views
0

Ich versuche, Xml mit einem separaten Thread zu analysieren. Das kleine Code-Snippet des gesamten Codes ist wie folgt:Run-Methode wird nicht aufgerufen Thread

Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try{ 
      c=c1; 
      URL url = new URL(url1); 
      HttpURLConnection con= (HttpURLConnection) url.openConnection(); 
      InputStream i= con.getInputStream(); 
      xf=XmlPullParserFactory.newInstance(); 
      xp=xf.newPullParser(); 
      xp.setInput(i,null); 
      parseXML(xp,c); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 

     } 


     } 
    }); 
    t.start(); 

Aber es scheint, die Run-Methode wird nicht selbst aufgerufen. Kann mir bitte jemand helfen, herauszufinden, was ich hier vermisse.

EDIT: Es folgt der gesamte Code in XML bezogen werden:

public void fetchXml(String u,final Context c1) throws IOException, XmlPullParserException, InterruptedException { 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try{ 

      c=c1; 
       URL url = new URL(url1); 
      HttpURLConnection con= (HttpURLConnection) url.openConnection(); 
      InputStream i= con.getInputStream(); 
      xf=XmlPullParserFactory.newInstance(); 
      xp=xf.newPullParser(); 
      xp.setInput(i,null); 
      parseXML(xp,c); 
     } 
     catch(Exception e) 
     { 

      e.printStackTrace(); 

     } 
    } 
    }); 

    t.start(); 
    t.join(); 
    } 


    public void parseXML(XmlPullParser xp,Context c) throws XmlPullParserException, IOException { 

    int event; 
    String text=null; 
    Toast.makeText(c, "inside parse", Toast.LENGTH_LONG).show(); 

    event=xp.getEventType(); 

    while(event!=XmlPullParser.END_DOCUMENT) 
    { 

     String name=xp.getName(); 

     switch(event) 
     { 

      case XmlPullParser.START_TAG : 
       break; 

      case XmlPullParser.TEXT : 
       text=xp.getText(); 
       break; 

      case XmlPullParser.END_TAG : 
       if(name.equals("country")){ 
        country=text; 
        Toast.makeText(c, "Country"+country, Toast.LENGTH_LONG).show(); 
       } 
       else if(name.equals("humidity")){ 

        humidity=xp.getAttributeValue(null,"value"); 
        Toast.makeText(c, "humidity"+humidity, Toast.LENGTH_LONG).show(); 
       } 

       else if (name.equals("pressure")) 
       { 
        pressure=xp.getAttributeValue(null,"value"); 
        Toast.makeText(c, "pressure"+pressure, Toast.LENGTH_LONG).show(); 
       } 
       else{} 
       break; 
    } 
     event=xp.next(); 
    } 
    parsingcomplete=true; 
    } 

Auch wenn ich überprüfte die logcat Ich erhalte die folgende Fehlermeldung für den Toast Aussage, die ich in der parseXML Funktion oben schrieb.

04-11 07:59:08.891 31361-31580/com.example.hp.xmlparsing W/System.err: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
04-11 07:59:08.892 31361-31580/com.example.hp.xmlparsing W/System.err:  at android.os.Handler.<init>(Handler.java:200) 

Es sieht aus wie die run-Methode läuft fine..but ich die Ausnahme bin immer:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

Kann jemand bitte helfen ...

+0

Was lässt Sie denken, dass es nicht angerufen wird? – Savior

+0

Hinzufügen 't.join()' nach 't.start()' –

+0

@ElliottFrisch nur neugierig wie wird t.join() einen Unterschied machen? – Jois

Antwort

1

Run

Toast.makeText(c, "inside parse", Toast.LENGTH_LONG).show(); 

innerhalb der GUI Thread:

runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         Toast.makeText(c, "inside parse", Toast.LENGTH_LONG).show(); 
        } 
       }); 
+0

danke für die oben .. ich bin in der Lage, den Toast auf UI-Thread zu zeigen .. Aber jetzt bekomme ich eine Ausnahme: Java.lang.RuntimeException: Kann nicht Handler innerhalb Thread erstellen, die Looper.prepare nicht aufgerufen hat () – ghostrider