我应该启动一个线程来解析一些xml吗?

问题描述:

我有点新的Android开发,但我想做一个XML解析器。我一直在使用android.sax库,遵循一些tutos,这很好。 的一件事就是让我怀疑的是,我实际上并不在一个单独的线程执行分析器,我只是用我的处理程序解析器和我的主要活动之间的通信。 我应该解析一个线程吗?我应该启动一个线程来解析一些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

我不认为这是解析这么多的网络操作,因为任何网络请求不应该在UI线程来执行。您可以产生一个新的ThreadAsyncTask来执行您的网络请求。这里有一些链接,可以帮助:

+0

恩,非常感谢你的链接。我会研究它。 – MagicMicky

是的,这是你必须将你解析成后台线程,特别是如果你的XML被通过网络流;否则你的应用程序很可能被系统阻止主线程而中断。

您不必使用原始Thread,虽然; Android提供了诸如ASyncTask之类的内容,使其更容易一些。

一个简单的答wer: 如果在主(UI)线程中有连接,则在线程用于下载信息并对其进行解析时,用户界面将被冻结。连接需要一段时间,因此可能会冻结。

除此之外,android 4.0现在实际上并不允许你从这个线程调用HTTP请求,它会抛出一个错误,这将在崩溃之前在logcat中看到。

这里最好使用一个异步任务,这里有一些更多的信息。 Information on Async Tasks

与GUI直接交互无关的所有东西都应该移动到单独的线程,如果您需要与来自该线程的GUI进行交互,则可以使用AsyncTask,因为Android不允许从常规线程类访问GUI。

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