2012-03-16 7 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読み取りコードスニペットを含めます。すべてのXMLファイルを読み終えたら、onPostExecute()メソッドで結果を表示できます。

スレッドクラスの使用は推奨されていません。詳細はlink to documentationです。このプロセスはNetworkOnMainThreadExceptionからあなたを取り除くでしょう。

+0

あなたのアップデートは後で見ました。プラットフォーム3よりも高いデバイスでコードを実行していると思います。インターネット接続にバックグラウンドスレッドを使用していないときは 'NetworkOnMainThreadException'を返します。 – AnujAroshA

+0

どうすればいいですか? スレッドを使用していますが、それでも例外が発生します,,, – ZeeDroid

+0

スレッドクラスを使用しないで、代わりに 'AsyncTask'クラスを使用します。また、 'doInBackground'メソッドでXMLを構文解析するなどのバックグラウンドタスクをすべて行います。 – AnujAroshA

0

あなたはスレッドを拡張するものの、だけでなく、スレッドの方法で実行していけないparseあなたの方法は、例えば、run方法でparse方法を入れてください:

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

しかし、それは新しい例外をスローする:doInBackground()の実行中にエラーが発生しました。私はAsyncTaskでスレッドの解析を開始するので、Asynctask ???でそのスレッドを開始するとポーズ可能ですか? – ZeeDroid

+0

新しい例外を投げますか? – idiottiger

+0

およびこの例外:WindowManager(3494):アクティビティcom.portalshop.zendy.ListProductLamaは、もともとここに追加された[email protected]ウィンドウをリークしました – ZeeDroid

関連する問題