2012-05-06 8 views
1

私はちょっとAndroid開発の新人ですが、私はXMLパーサを作ろうとしています。私はいくつかのtutosの後にandroid.saxライブラリを使用しています。これは素晴らしいです。 私は懐疑的に思っていることの一つは、実際に別のスレッドでパーサを起動するのではなく、ハンドラを使ってパーサーと私の主なアクティビティをやりとりするということです。 スレッドで解析する必要がありますか?ここでスレッドを起動してXMLを解析する必要がありますか?

は私の主な活動コードです:

 tv = (TextView)findViewById(R.id.tv); 

    try { 
     URL url = new URL("https://www.googleapis.com/shopping/search/v1/public/products?key=AAAAABBBBBCCCCDDDEEEEFFF&country=FR&restrictBy=gtin=5030999075254&alt=atom"); 
     XMLHandler xHandler = new XMLHandler(); 
     Feed feed = xHandler.parse(url.openStream()); 

      if(feed.getTotalResults()==0 || feed.getItems() == null || feed.getItems().isEmpty()) { 
       Log.w("XMLPARSENull", "No items 
      } 
      else { 
       tv.setText(feed.getTotalResults()+" " + feed.getItemsPerPage() + " " + feed.getStartIndex() + " " + feed.getTitle()); 
       Iterator<Product> it = feed.getItems().iterator(); 
       while(it.hasNext()) { 
        Log.w("XMLPARSEFeed",it.next().getName()); 

       } 
      } 


    } catch(Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     Log.e("XMLPARSEException", "ERROR",e); 
    } 
+0

あなたが出始めている場合は、[StrictMode](http://android-developers.blogspot.se/2010/12/new-gingerbread-api-strictmodeを見てみるのが賢明である可能性があります。 html) - それはあなたが属していないスレッドで何かばかげたことをしたときに、かなり速くあなたに伝えます。 – Jens

答えて

4

私はそれがネットワーク操作と同じくらい構文解析していると思っています。どのネットワーク要求もUIスレッドでは実行しないでください。新しいThreadまたはAsyncTaskを生成してネットワーク要求を実行することができます。

+0

さて、どうもありがとうございました。私はそれを調べます。 – MagicMicky

0

はい、あなたがあなたのXMLは、ネットワーク経由でストリーミングされている場合は特に、バックグラウンドスレッドにあなたの解析を移動することが不可欠です。それ以外の場合は、メインスレッドをブロックするためにシステムによってシステムが強制終了される可能性があります。

raw Threadを使用する必要はありません。 Androidでは、ASyncTaskのようなものが用意されています。

1

シンプルANS:ここに助けるためにいくつかのリンクがありますwer: メイン(UI)スレッドで接続している場合、ユーザーインターフェイスはフリーズし、スレッドは情報をダウンロードして解析するために使用されます。接続に時間がかかるため、フリーズしているように見えることがあります。

これ以外にも、アンドロイド4.0では実際にこのスレッドからHTTPリクエストを呼び出すことはできません。クラッシュする前にlogcatに表示されるエラーがスローされます。

ここでは非同期タスクを使用することをお勧めします。 Information on Async Tasks

0

GUIとの直接のやりとりに関係しないものは、別のスレッドに移動する必要があります.Onyncは通常のスレッドクラスからGUIにアクセスすることができないため、そのスレッドからGUIとのやりとりが必要な場合にはAsyncTaskを優先します。

http://developer.android.com/reference/android/os/AsyncTask.html

関連する問題