Форум программистов, компьютерный форум CyberForum.ru

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

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

Медленный XmlPullParser - Android

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

Всем привет!
Собственно проблема всего лишь в скорости работы, по логам посмотрел что медленно грузит так это именно:
Java
1
2
3
4
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(getInputStream(url), null); // <-- а конкретнее именно он!
То есть, у меня просто длинный Xml, вопрос в следующем - как оптимизировать?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
15.01.2016, 12:33     Медленный XmlPullParser #2
OneXeor, привет!
Насколько длинный XML? Можно также попробовать SAX-parser. А поток, откуда читается XML, откуда берётся?
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 13:25  [ТС]     Медленный XmlPullParser #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;
        }
    }
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
15.01.2016, 14:37     Медленный XmlPullParser #4
OneXeor, а вы пробовали выводить содержимое потока, например, в Log (частями по 3000 символов)? Можете попробовать засечь начало считывания и конец вывода, чтобы определить время. Я не уверен, что "тормозит" именно он.
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 14:49  [ТС]     Медленный XmlPullParser #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 символов)? Можете попробовать засечь начало считывания и конец вывода, чтобы определить время. Я не уверен, что "тормозит" именно он.
Не подскажите как это сделать?)
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
15.01.2016, 14:59     Медленный XmlPullParser #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.
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 14:59  [ТС]     Медленный XmlPullParser #7
Хм, нельзя не согласиться, тогда буду делать через добавление в бд и подгрузку из XML если есть что то новое.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
15.01.2016, 15:02     Медленный XmlPullParser #8
OneXeor, здорово придумали.
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 15:04  [ТС]     Медленный XmlPullParser #9
Цитата Сообщение от CoolMind Посмотреть сообщение
OneXeor, здорово придумали.
Странно как то звучит... С долей сарказма
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 835
15.01.2016, 15:35     Медленный XmlPullParser #10
Цитата Сообщение от OneXeor Посмотреть сообщение
И постоянно уходит 9 секунд - постоянно, как будто где то фриз. Но его нигде нет...
Цитата Сообщение от CoolMind Посмотреть сообщение
Когда щёлкаешь по ссылке, очень долго грузится. Я не знаю, виноват ли в этом браузер, но мне кажется, что "тормоза" на сайте.
во во, такая же фигня, даже засек, где то тоже в районе 9 секунд, так что проблемка не в парсере.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
15.01.2016, 15:41     Медленный XmlPullParser #11
Цитата Сообщение от androbro Посмотреть сообщение
где то тоже в районе 9 секунд
Долой сервера на первых "Пеньках"
Цитата Сообщение от OneXeor Посмотреть сообщение
Странно как то звучит... С долей сарказма
Просто я пока не знаю, каким образом вы узнаете, появилось что-то новое или читать из БД. Если без ожидания 9 секунд можно как-то опросить сервер на предмет обновления информации, то хорошо. Если же сервер выдаёт только XML, то никак.
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 15:50  [ТС]     Медленный XmlPullParser #12
Цитата Сообщение от CoolMind Посмотреть сообщение
Сообщение от androbro
где то тоже в районе 9 секунд
Долой сервера на первых "Пеньках"
Сообщение от OneXeor
Странно как то звучит... С долей сарказма
Просто я пока не знаю, каким образом вы узнаете, появилось что-то новое или читать из БД. Если без ожидания 9 секунд можно как-то опросить сервер на предмет обновления информации, то хорошо. Если же сервер выдаёт только XML, то никак.
Именно, я думал читать из БД через JSON, но потом вспомнил что у меня доступа нет, и сейчас даже не знаю что делать)
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
15.01.2016, 15:58     Медленный XmlPullParser #13
OneXeor, если нет доступа к API сервера, то можно попробовать рисовать кружочек, выводить из БД, затем писать, что информация обновляется, и выводить новые данные, затем убирать кружочек. Но всё равно, работать будет невозможно.
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 16:01  [ТС]     Медленный XmlPullParser #14
Цитата Сообщение от CoolMind Посмотреть сообщение
OneXeor, если нет доступа к API сервера, то можно попробовать рисовать кружочек, выводить из БД, затем писать, что информация обновляется, и выводить новые данные, затем убирать кружочек. Но всё равно, работать будет невозможно.
Цитата Сообщение от CoolMind Посмотреть сообщение
OneXeor, если нет доступа к API сервера, то можно попробовать рисовать кружочек, выводить из БД, затем писать, что информация обновляется, и выводить новые данные, затем убирать кружочек. Но всё равно, работать будет невозможно.
Однозначно не вариант у меня нет доступа к бд сайта, progressBar я и так вывожу, и он крутится 9 сек, а потом показывает всё,
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
15.01.2016, 16:07     Медленный XmlPullParser #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
OneXeor, даже не знаю, что посоветовать. Если сам сайт - вменяемый, работает быстро, то, видимо, backend-программист там пиво лаптем хлебает. Потому что таких "тормозов" на сравнительно небольшом XML я ещё не видал. Возможно, сделано специально, чтобы пользоваться было невозможно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2016, 16:17     Медленный XmlPullParser
Еще ссылки по теме:

Медленный интернет (
Android Самозакрывающийся тег XmlPullParser
C# Медленный пинг
RSS reader by XmlPullParser + Listview Android
Android Слишком медленный алгоритм искусственного интеллекта игры Балда

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

Или воспользуйтесь поиском по форуму:
OneXeor
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 19
15.01.2016, 16:17  [ТС]     Медленный XmlPullParser #16
Ну да, дело в том что это форма yml от Яндекс может сам посебе такой)
Yandex
Объявления
15.01.2016, 16:17     Медленный XmlPullParser
Ответ Создать тему
Опции темы

Текущее время: 11:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru