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

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

Войти
Регистрация
Восстановить пароль
 
dajver
409 / 273 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
#1

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

04.05.2015, 19:44. Просмотров 237. Ответов 2
Метки нет (Все метки)

Заголовок интригующий надеюсь)

Проблема состоит в следующем, я тырю иконки с сайтов для отображения ссылок на сайты с иконками. Делаю я это так

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
try {
            Document doc = Jsoup.connect(url).get();
            Element element = doc.head().select("link[href~=.*\\.(ico|png)]").first();
            if (element != null) {
                if (element.attr("href").substring(0, 2).contains("//")) {
                    return "http:" + element.attr("href");
                } else if (element.attr("href").substring(0, 4).contains("http")) {
                    return element.attr("href");
                } else {
                    return replaceUrl(url) + element.attr("href");
                }
            } else {
                return "";
            }
        } catch(IllegalArgumentException ex) {
            ex.printStackTrace();
        } catch(OutOfMemoryError er) {
            er.printStackTrace();
        }
        return "";
В целом алгоритм такой: беру ссылку на сайт, нахожу там парсингом нужную иконку и сохраняю ссылку у себя. Но вот когда ссылок в списке больше ну пусть 20 штук(бывает и больше) то приложение начинает падать с OutOfMemotyError, на некоторых телефонах не падает, наверное из за того что они мощней...

Может как-то что-то посоветуете? Сократить список нельзя, надо что бы выводилось все что есть в бд.

Может возможно это как то оптимизировать что бы оно в фоне грузило?) Или я даже не знаю, асинк таск грузит еще сильней и приложение падает еще быстрее...

Добавлено через 2 часа 37 минут
Моет я как то не правильно вопрос задал что никто не отвечает?)

Добавлено через 42 минуты
Дам более развернутый вопрос.

У меня есть класс который тырит все нужные иконки
Кликните здесь для просмотра всего текста
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
43
44
45
46
47
48
49
public class GrabIconsFromWebPage {
    public static String replaceUrl(String url) {
        StringBuffer sb = new StringBuffer();
        Pattern p = Pattern.compile("https?://.+\\..+?\\/");
        Matcher m = p.matcher(url);
        while (m.find()) {
            sb.append(m.group());
        }
        return sb.toString();
    }
 
    public static String getFavicon(String url) throws IOException {
        try {
            Document doc = Jsoup.connect(url).get();
            Element element = doc.head().select("link[href~=.*\\.(ico|png)]").first();
            if (element != null) {
                if (element.attr("href").substring(0, 2).contains("//")) {
                    return "http:" + element.attr("href");
                } else if (element.attr("href").substring(0, 4).contains("http")) {
                    return element.attr("href");
                } else {
                    return replaceUrl(url) + element.attr("href");
                }
            } else {
                return "";
            }
        } catch(IllegalArgumentException ex) {
            ex.printStackTrace();
        } catch(OutOfMemoryError er) {
            er.printStackTrace();
        }
        return "";
    }
 
    public static Bitmap getBitmapFromURL(String src) {
        try {
            URL url = new URL(src);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}


И вот как я вызываю нужные методы что бы получить битмап:
Java
1
2
3
4
5
Bitmap faviconBitmap = GrabIconsFromWebPage.getBitmapFromURL(
                                    GrabIconsFromWebPage.getFavicon(
                                            bookmarkData.get(position).getUrl() // ссылка на сайт с которого краду иконку
                                    )
                            );
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
07.05.2015, 08:36 #2
dajver, хах, ну ты даёшь! Как умудрился словить Exception и не знать, где он? На чужих смартфонах через crashlytics? Всё равно же строчку, где падает, поймать можно.
Я не пользовался Jsoup, а пользовался двумя другими библиотеками по разбору JSON. Типичная библиотека читает весь поток в память и при достижении файла где-нибудь в 6 Мб роняет многие смартфоны. Поэтому надо использовать другие (на основе GSON или Jackson, уже и забыл, как они называются). Такие библиотеки читают файл в память последовательно. Но разбирать их становится сложно. Я пару недель мучался.

Добавлено через 7 часов 55 минут
Парсинг большого объема JSON данных
1
dajver
409 / 273 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
07.05.2015, 18:14  [ТС] #3
Глупая затея была парсить самому)ГУГЛ ВСЕ СДЕЛАЛ ЗА НАС)

http://www.google.com/s2/favicons?domain=(Ссылка на сайт с которого хотим иконку)
0
Ответ Создать тему
Опции темы

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