Intereting Posts
Дисплей пейджингового управления с белыми точками на верхней части Android Как обнаружить запущенное приложение с помощью команды ADB Создайте проект для тестирования Android в выпуске intellij idea 13 community Как масштабировать анимированный текст в виде андроида вправо Нарисовать текст поверх растрового изображения не удалось Изменение цвета фона в BottomNavigationView Приложение Pjsua, сделанное ошибкой сообщения регистра pjsip? Как программно добавить несколько LinearLayouts в одно представление, а затем добавить в ViewFlipper? RenderScript: использование ScriptGroup для процесса обработки изображений приводит к появлению горизонтальных полос Как добавить интеграцию библиотеки объявлений mopub с андроид-студией Ресурс Idpresso Idling не работает Как отложить выполнение андроида Связать два apk в один apk? Как установить Свертывание высоты ToolBar Ошибка «Невозможно создать надежное соединение с сервером» во время входа в систему с помощью google plus

Есть ли что-то быстрее, чем Jsoup для очистки HTML?

Поэтому я создаю приложение, которое отображает графический план с сайта, на который я перехожу, в более удобный интерфейс. На данный момент у него много проблем, но самый большой из них – это выбор изображений для их отображения.

То, как я это делаю прямо сейчас, изображения отображаются в GridView размером 12, отражая количество изображений на каждой странице графического планшета. Я использую Jsoup для очистки страницы URL-адресов изображений эскизов, отображаемых в GridView, а также получения URL-адресов для полноразмерных изображений, отображаемых, когда пользователь нажимает на миниатюру.

Проблема прямо сейчас заключается в том, что в среднем за 8-12 секунд для Jsoup требуется очистить HTML-страницу. Это я считаю неприемлемым, и мне было интересно, есть ли способ сделать это быстрее или если это станет неотъемлемым узким местом, о котором я ничего не могу сделать.

Вот код, который я использую, чтобы извлечь страницу для очистки:

try { Document doc = Jsoup.connect(url).get(); Elements links = doc.select("img[src*=/alt2/]"); for (Element link : links) { thumbURL = link.attr("src"); linkURL = thumbURL.replace("/alt2/", "/").replace("s.jpg", ".jpg"); imgSrc.add(new Pair<String, String>(thumbURL, linkURL)); } } catch { e.printStackTrace(); } 

Я использовал Jsoup для скребка TLFN, и у меня не было проблем со скоростью. Вы должны сузить узкое место. Я предполагаю, что вы соскабливаете, что вызывает проблему скорости. Попробуйте отслеживать свой селектор и сетевой трафик отдельно и посмотреть, что виноват. Если ваш видоискатель виноват, подумайте о том, чтобы найти другой подход для запросов и сравнения результатов.

Для более быстрой, общей идеи, тестирования вы всегда можете запускать Jsoup из обычного Java-проекта, и когда вам кажется, что вы его улучшили, бросьте его обратно на устройство и посмотрите, имеет ли он аналогичные улучшения производительности.

РЕДАКТИРОВАТЬ

Не то, чтобы это ваша проблема, но имейте в виду, что использование итераторов может привести к сбою мусора. Обычно это не вызывает беспокойства, хотя, если вы используете их во многих местах с большим количеством повторений, они могут привести к тому, что некоторые устройства смогут заметно повысить производительность.

не хорошо

 for (Element link : links) 

лучше

 int i; Element tempLink; for (i=0;i<links.size();i++) { tempLink = links.get(i); } 

EDIT 2

Если URL-адреса изображений начинаются с / alt2 /, вы можете использовать ^ = вместо * =, что потенциально может ускорить поиск. Кроме того, в зависимости от количества HTML, вы можете тратить много времени на поиск совершенно неправильного места для этих изображений. Убедитесь, что эти изображения обернуты внутри идентифицируемого контейнера, например, что-то вроде <div class="posts"> . Если вы можете сузить количество HTML для просеивания, это может повысить производительность.

Хотя немного отличается, этот вопрос имеет тот же ответ, что и скремблирование динамически генерируемого html внутри приложения Android .

Короче говоря, вы должны разгрузить часть «загрузить и разобрать» на удаленную веб-службу. См. Веб-скребок с Android для обсуждения.

Посмотрите Bobik , платформу для очистки в реальном времени, в частности эту страницу .

Я столкнулся с тем же вопросом:

Logcat на моем HTC One S ясно показывает, что ответ на соединение занимает первые 4 секунды (3 соединения параллельно). Парсинг занимает почти 30-40 секунд, что является ОГРОМНЫМ временем. Обратите внимание, что HTC One S имеет очень быструю двойную связь с 1,4 Гц. Проблема явно не связана с эмулятором

 02-27 14:11:55.278: DEBUG/MyActivity(10735): =c> 02-27 14:11:55.278: DEBUG/MyActivity(10735): =c> 02-27 14:11:55.278: DEBUG/MyActivity(10735): =c> 02-27 14:11:59.002: DEBUG/MyActivity(10735): <r= 02-27 14:11:59.012: DEBUG/MyActivity(10735): <r= 02-27 14:11:59.422: DEBUG/MyActivity(10735): <r= 02-27 14:12:33.949: DEBUG/MyActivity(10735): <d= 02-27 14:12:37.463: DEBUG/MyActivity(10735): <d= 02-27 14:12:38.294: DEBUG/MyActivity(10735): <d= 

Это мой код:

 // Jsoup-Connection Connection c = Jsoup.connect(urls[0]); // Request timeout in ms c.timeout(5000); Connection.Response r = c.execute(); Log.d("MyActivity","<r= doInBackground ("+urls[0]+")"); // Get the actual Document Document doc = r.parse(); Log.d("MyActivity","<d= doInBackground ("+urls[0]+")"); 

Обновить:

 02-27 20:38:25.649: INFO/MyActivity(18253): !=c> 02-27 20:38:27.511: INFO/MyActivity(18253): !<r= 02-27 20:38:28.873: INFO/MyActivity(18253): !#d= 

Я получил некоторые новые результаты. Предыдущие были из запуска моего приложения на Android в качестве DEBUGGING .. теперь опубликованные результаты запускаются без режима отладки (из IntelliJ IDE). Любое объяснение, почему отладка делает Jsoup настолько медленным?

Запустив debuggin на моем i5-Desktop-Machine, я не получил штраф за производительность.

Преступник, почему мой код настолько медленный на Android, безусловно, является режимом режима DEBUG . Он замедляет jsoup в 100 раз.

Можете ли вы лучше определить контент, который хотите получить, потому что есть только одна причина, которая может замедлить выполнение вашего кода

 select("img[src*=/alt2/]") 

Есть ли общий «класс» с изображениями, которые вы хотите получить?