我应该启动一个线程来解析一些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);
}
我不认为这是解析这么多的网络操作,因为任何网络请求不应该在UI线程来执行。您可以产生一个新的Thread
或AsyncTask
来执行您的网络请求。这里有一些链接,可以帮助:
恩,非常感谢你的链接。我会研究它。 – 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
如果你开始了它可能是明智的,看看[StrictMode(http://android-developers.blogspot.se/2010/12/new-gingerbread-api-strictmode。 html) - 当你在一个不属于它的线程上做一些愚蠢的事情时,它会很快告诉你。 – Jens