2016-04-11 99 views
0

我想分析xml使用一个单独的线程。整个代码的小代码片段如下:运行方法没有调用线程

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(); 

但似乎运行方法没有被调用本身。有人可以帮助我找出我在这里错过了什么。

编辑: 以下是有关XML整个代码:

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; 
    } 

此外,当我检查了logcat的我收到以下错误的吐司声明,我写在上面的parsexml函数内。

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) 

它看起来像run方法运行fine..but我得到异常:

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

能有人帮...

+0

是什么让你觉得它没有被叫? – Savior

+0

在't.start()'后添加't.join()' –

+0

@ElliottFrisch只是好奇t.join()会如何区别? – Jois

回答

1

运行

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

里面的GUI线程:

runOnUiThread(new Runnable() { 

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

感谢上述..我能够显示UI线程上的敬酒..但现在我得到一个异常: Java.lang.RuntimeException:不能创建处理程序内部没有调用Looper.prepare( ) – ghostrider