2016-04-11 14 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(); 

しかし、実行方法が呼び出されていないようです。誰かが私がここで逃しているものを見つけ出すのを手伝ってくれる?

EDIT: 以下は、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; 
    } 

また、私は私が私が上記parsexml関数内で書いたトースト文に対して、次のエラーを取得していますlogcatをチェックしました。

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) 

私は例外を取得していますfine..but runメソッドが実行されているように見えます:

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()がどのようにdiffrenceを作成するのだろうか? – 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