Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
#1

Медленный XmlPullParser - Программирование Android

15.01.2016, 01:45. Просмотров 342. Ответов 15

Всем привет!
Собственно проблема всего лишь в скорости работы, по логам посмотрел что медленно грузит так это именно:
Java
1
2
3
4
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(getInputStream(url), null); // <-- а конкретнее именно он!
То есть, у меня просто длинный Xml, вопрос в следующем - как оптимизировать?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2016, 01:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Медленный XmlPullParser (Программирование Android):

Самозакрывающийся тег XmlPullParser - Программирование Android
Здравствуйте уважаемые форумчане! Возникла проблемка: не могу спарсить самозакрывающийся тег: &lt;string/&gt; Когда парсер нактнется на...

XmlPullParser неправильно получает значения - Программирование Android
Здравствуйте. Пытаюсь написать обработку XML сообщения от сервера, получить правильно данные (ссылку на изображение и имя), загрузить...

XmlPullParser - проверка существования атрибута - Программирование Android
Добрый день. Возникла необходимость проверять наличие в xml файле какого-либо атрибута. Подскажите метод, если таковой есть. В гугле и...

RSS reader by XmlPullParser + Listview - Программирование Android
Написал программу для чтения RSS: https://github.com/PhantomRec/RSS Всё работает, но проблема в том, что показывает 5-7 тем, далее...

XMLPullParser чтение русских символов - Программирование Android
Здравствуйте. Согласно заданию, необходимо написать парсер, который будет эммм... парсить(масло масленое) вот эту вот страницу...

Слишком медленный алгоритм искусственного интеллекта игры Балда - Программирование Android
Здравствуйте! Столкнулся с одной сложностью при создании искусственного интеллекта (ИИ) для своей игры Балда. Сначала опишу алгоритм...

15
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,734
15.01.2016, 12:33 #2
OneXeor, привет!
Насколько длинный XML? Можно также попробовать SAX-parser. А поток, откуда читается XML, откуда берётся?
0
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 13:25  [ТС] #3
Ну по сути XmlPullParser, работает по аналогии SAX, поэтому именно его хочу использовать.
А поток сейчас идет вот так
Java
1
2
3
4
5
6
Url url = new URL("http://ufa.farfor.ru/getyml/?key=ukAXxeJYZN");
InputStream stream = new BufferedInputStream(getInputStream(url)); // <-- вот, но  толку нет, теперь тут тормозит((
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(stream, null);
Добавлено через 1 минуту
По поводу размера XML, достаточно большой можно увидеть тут - http://ufa.farfor.ru/getyml/?key=ukAXxeJYZN

Добавлено через 25 минут
Чёт я туплю, вот отсюда)
Java
1
2
3
4
5
6
7
public InputStream getInputStream(URL url) {
        try {
            return url.openConnection().getInputStream();
        } catch (IOException e) {
            return null;
        }
    }
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,734
15.01.2016, 14:37 #4
OneXeor, а вы пробовали выводить содержимое потока, например, в Log (частями по 3000 символов)? Можете попробовать засечь начало считывания и конец вывода, чтобы определить время. Я не уверен, что "тормозит" именно он.
1
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 14:49  [ТС] #5
Я просто ради интереса везде наставил Log.
И постоянно уходит 9 секунд - постоянно, как будто где то фриз. Но его нигде нет... Так было с AsyncTask так же и с Chronos

Добавлено через 3 минуты
Хм пересобрал и теперь по 8 секунд

Добавлено через 1 минуту
Решил сбросить кусок
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 try {
            url = new URL("http://ufa.farfor.ru/getyml/?key=ukAXxeJYZN");
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.connect();
            InputStream streamCat = new BufferedInputStream(new BufferedInputStream(urlConnection.getInputStream()));
            factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();
            xpp.setInput(streamCat, null);
            boolean insideItem = false;
            int eventType = xpp.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_TAG) {
                    if (xpp.getName().equals("categories")) {
                        insideItem = true;
                    } else if (xpp.getName().equals(TAG_CATEGORY)) {
                        if (insideItem) {
                            categoryId = xpp.getAttributeValue(0);
                            category = xpp.nextText();
 
                            hashMap = new HashMap<>();
 
                            hashMap.put(TAG_CATEGORY_ID, categoryId);
                            hashMap.put(TAG_CATEGORY, category);
                            categories.add(hashMap);
                        }
                    }
                } else if (eventType == XmlPullParser.END_TAG && xpp.getName().equals("categories")) {
                    insideItem = false;
                }
 
                eventType = xpp.next(); //move to next element
            }
            urlConnection.disconnect();
        } catch (XmlPullParserException |
                IOException e
                )
 
        {
            e.printStackTrace();
        }
        return categories;
Добавлено через 46 секунд
Пробую с HttpURLConnection та же фигня

Добавлено через 5 минут
Цитата Сообщение от CoolMind Посмотреть сообщение
OneXeor, а вы пробовали выводить содержимое потока, например, в Log (частями по 3000 символов)? Можете попробовать засечь начало считывания и конец вывода, чтобы определить время. Я не уверен, что "тормозит" именно он.
Не подскажите как это сделать?)
1
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,734
15.01.2016, 14:59 #6
OneXeor, да, забыл сказать. Когда щёлкаешь по ссылке, очень долго грузится. Я не знаю, виноват ли в этом браузер, но мне кажется, что "тормоза" на сайте.

Добавлено через 1 минуту
Скорее всего, скрипт, который создаёт XML, сам долго его собирает.

Добавлено через 7 минут
Цитата Сообщение от OneXeor Посмотреть сообщение
Не подскажите как это сделать?)
Ммм, ну я сходу вам не напишу алгоритма (раньше писал, но лень искать).
Засекаете время. Записываете весь поток в строку s. Дальше делаете что-то типа
Java
1
Log.i("***", s.substr(0, 3000));
Например, (дальше псевдокоды, я уже не помню функций):
Java
1
2
3
4
5
Date t = new Date();
String s = stream.toString(); // Или другой метод для чтения потока.
Log.i("Начало", s.substr(1, 3000));
Log.i("Конец", s.substr(s.length() - 2999, s.length());
Log.i("Время", ...); // Берёте разность между текущим временем и t.
1
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 14:59  [ТС] #7
Хм, нельзя не согласиться, тогда буду делать через добавление в бд и подгрузку из XML если есть что то новое.
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,734
15.01.2016, 15:02 #8
OneXeor, здорово придумали.
1
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 15:04  [ТС] #9
Цитата Сообщение от CoolMind Посмотреть сообщение
OneXeor, здорово придумали.
Странно как то звучит... С долей сарказма
1
androbro
330 / 291 / 62
Регистрация: 17.10.2014
Сообщений: 864
15.01.2016, 15:35 #10
Цитата Сообщение от OneXeor Посмотреть сообщение
И постоянно уходит 9 секунд - постоянно, как будто где то фриз. Но его нигде нет...
Цитата Сообщение от CoolMind Посмотреть сообщение
Когда щёлкаешь по ссылке, очень долго грузится. Я не знаю, виноват ли в этом браузер, но мне кажется, что "тормоза" на сайте.
во во, такая же фигня, даже засек, где то тоже в районе 9 секунд, так что проблемка не в парсере.
2
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,734
15.01.2016, 15:41 #11
Цитата Сообщение от androbro Посмотреть сообщение
где то тоже в районе 9 секунд
Долой сервера на первых "Пеньках"
Цитата Сообщение от OneXeor Посмотреть сообщение
Странно как то звучит... С долей сарказма
Просто я пока не знаю, каким образом вы узнаете, появилось что-то новое или читать из БД. Если без ожидания 9 секунд можно как-то опросить сервер на предмет обновления информации, то хорошо. Если же сервер выдаёт только XML, то никак.
2
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 15:50  [ТС] #12
Цитата Сообщение от CoolMind Посмотреть сообщение
Сообщение от androbro
где то тоже в районе 9 секунд
Долой сервера на первых "Пеньках"
Сообщение от OneXeor
Странно как то звучит... С долей сарказма
Просто я пока не знаю, каким образом вы узнаете, появилось что-то новое или читать из БД. Если без ожидания 9 секунд можно как-то опросить сервер на предмет обновления информации, то хорошо. Если же сервер выдаёт только XML, то никак.
Именно, я думал читать из БД через JSON, но потом вспомнил что у меня доступа нет, и сейчас даже не знаю что делать)
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,734
15.01.2016, 15:58 #13
OneXeor, если нет доступа к API сервера, то можно попробовать рисовать кружочек, выводить из БД, затем писать, что информация обновляется, и выводить новые данные, затем убирать кружочек. Но всё равно, работать будет невозможно.
0
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 16:01  [ТС] #14
Цитата Сообщение от CoolMind Посмотреть сообщение
OneXeor, если нет доступа к API сервера, то можно попробовать рисовать кружочек, выводить из БД, затем писать, что информация обновляется, и выводить новые данные, затем убирать кружочек. Но всё равно, работать будет невозможно.
Цитата Сообщение от CoolMind Посмотреть сообщение
OneXeor, если нет доступа к API сервера, то можно попробовать рисовать кружочек, выводить из БД, затем писать, что информация обновляется, и выводить новые данные, затем убирать кружочек. Но всё равно, работать будет невозможно.
Однозначно не вариант у меня нет доступа к бд сайта, progressBar я и так вывожу, и он крутится 9 сек, а потом показывает всё,
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,734
15.01.2016, 16:07 #15
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
OneXeor, даже не знаю, что посоветовать. Если сам сайт - вменяемый, работает быстро, то, видимо, backend-программист там пиво лаптем хлебает. Потому что таких "тормозов" на сравнительно небольшом XML я ещё не видал. Возможно, сделано специально, чтобы пользоваться было невозможно.
2
15.01.2016, 16:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2016, 16:07
Привет! Вот еще темы с ответами:

Медленный ввод в текстовые поля / медленный отклик в google chrome? - Софт
Привет! Может кто знает, Сегодня заметил, что ввод текста в браузере chrome стал очень медленным и отклик тоже. Например, при наборе...

Медленный интернет - Debian Linux
Здравствуйте. Я установил Debian Gnome . Поставил NetworkManager , подключился к wi-fi сети . У меня стоит wi-fi маршрутизатор-ADSL модем ,...

Медленный пинг - C#
Добрый день, уважаемые знатоки :senor: Собственно возникла проблема в timeout ping.SendPingAsync(...); Проблема: Дело в том,...

Медленный интернет ( - Сетевое оборудование
Добрый день, товарищи ) Помогите разобраться в следующем.. Как то лет пять назад подключил интернет от домашней телефонной сети...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.