Я немного новичок в разработке 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);
}
Я не думаю, что это синтаксический анализ так же, как сетевая операция, так как любой сетевой запрос не должен выполняться в потоке пользовательского интерфейса. Вы можете породить новую Thread
или AsyncTask
для выполнения запроса по сети. Вот несколько ссылок, которые помогут:
Простой ответ. Если у вас есть связи в потоке основного (пользовательского интерфейса), пользовательский интерфейс станет замороженным, пока поток используется для загрузки информации и ее анализа. Для соединения требуется некоторое время, чтобы оно могло замерзнуть.
Кроме того, теперь андроид 4.0 фактически не позволяет вам вызывать HTTP-запросы из этого потока, он выдает ошибку, которая будет видна в logcat перед сбоем.
Лучше всего использовать задачу Async здесь, вот еще несколько сведений об этом. Информация об асинхронных задачах !
Все, что не связано с прямым взаимодействием с GUI, должно быть перемещено в отдельный поток, желательно AsyncTask, если вам нужно взаимодействие с графическим интерфейсом из этого потока, так как Android не разрешит доступ к GUI из обычного класса Thread.
http://developer.android.com/reference/android/os/AsyncTask.html
Да, крайне важно, чтобы ваш синтаксический анализ переносился в фоновый поток, особенно если ваш XML транслируется по сети; иначе ваше приложение, вероятно, будет уничтожено системой для блокировки основного потока.
Однако вам не нужно использовать сырой Thread
; Android предоставляет такие вещи, как ASyncTask
чтобы сделать это немного проще.