1

我对android开发有点陌生,但我正在尝试制作一个xml解析器。我一直在使用 android.sax 库,遵循一些教程,这很好用。让我怀疑的一件事是,我实际上并没有在单独的线程中启动解析器,我只是使用处理程序在解析器和主要活动之间进行通信。我应该在 Thread 中解析吗?

这是我的主要活动代码:

        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);
    }
4

4 回答 4

4

我认为与其说是解析不如说是网络操作,因为任何网络请求都不应该在 UI 线程中执行。您可以生成一个新Thread的或一个AsyncTask来执行您的网络请求。以下是一些帮助链接:

于 2012-05-06T22:08:43.087 回答
1

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

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

最佳做法是在此处使用异步任务,这里有一些关于此的更多信息。 关于异步任务的信息

于 2012-05-06T22:43:50.683 回答
0

是的,您必须将解析移到后台线程中,尤其是当您的 XML 正在通过网络传输时;否则你的应用程序很可能会被系统阻塞主线程。

不过,您不必使用 raw Thread;Android提供了一些ASyncTask让它变得更容易的东西。

于 2012-05-06T21:45:55.017 回答
0

与 GUI 直接交互无关的所有内容都应移至单独的线程,如果您需要从该线程与 GUI 交互,最好是 AsyncTask,因为 Android 不允许从常规 Thread 类访问 GUI。

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

于 2012-05-06T23:23:46.220 回答