Должен ли я запустить поток для анализа некоторых XML?

1

Я немного новичок в разработке Android, но я пытаюсь сделать XML-парсер. Я использую библиотеку android.sax, следуя некоторым туто, и это отлично работает. Одна вещь, которая делает меня скептически, заключается в том, что я фактически не запускаю парсер в отдельном потоке, я просто использую обработчики для связи между моим парсером и моей основной деятельностью. Должен ли я разбираться в теме?

Здесь мой основной код активности:

        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 - он довольно быстро сообщает вам, когда вы делаете что-то глупое в потоке, которому он не принадлежит.
Теги:
multithreading
handler
parsing

4 ответа

4
Лучший ответ

Я не думаю, что это синтаксический анализ так же, как сетевая операция, так как любой сетевой запрос не должен выполняться в потоке пользовательского интерфейса. Вы можете породить новую Thread или AsyncTask для выполнения запроса по сети. Вот несколько ссылок, которые помогут:

  • 0
    Что ж, большое спасибо за ссылки. Я посмотрю на это.
1

Простой ответ. Если у вас есть связи в потоке основного (пользовательского интерфейса), пользовательский интерфейс станет замороженным, пока поток используется для загрузки информации и ее анализа. Для соединения требуется некоторое время, чтобы оно могло замерзнуть.

Кроме того, теперь андроид 4.0 фактически не позволяет вам вызывать HTTP-запросы из этого потока, он выдает ошибку, которая будет видна в logcat перед сбоем.

Лучше всего использовать задачу Async здесь, вот еще несколько сведений об этом. Информация об асинхронных задачах !

0

Все, что не связано с прямым взаимодействием с GUI, должно быть перемещено в отдельный поток, желательно AsyncTask, если вам нужно взаимодействие с графическим интерфейсом из этого потока, так как Android не разрешит доступ к GUI из обычного класса Thread.

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

0

Да, крайне важно, чтобы ваш синтаксический анализ переносился в фоновый поток, особенно если ваш XML транслируется по сети; иначе ваше приложение, вероятно, будет уничтожено системой для блокировки основного потока.

Однако вам не нужно использовать сырой Thread; Android предоставляет такие вещи, как ASyncTask чтобы сделать это немного проще.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню