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

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

Войти
Регистрация
Восстановить пароль
 
ExFau$t
167 / 150 / 29
Регистрация: 08.05.2012
Сообщений: 944
#1

Out of memory imageLoader - Android

27.11.2015, 13:14. Просмотров 286. Ответов 9
Метки нет (Все метки)

Добрый день. Проблема такая, есть таск, загружающий некую информацию и там же imageLoader. Переписал для этого в Thread'ы, но переполнение памяти не исключается.
Вопрос такой: как оптимально использовать память, чтобы не цеплять out of memory, грузить медленно, но уверенно? Желательно через thread, так как нужно высокоприеритетный поток запустить поверх загрузки. Может быть можно как-то выделить некий фиксированный объем памяти для всех потоков, а остальные держать в очереди?

Замечание: конфигурация самого loader'a по умолчанию, кроме размера кэша. Изменения там ни к чему не привели, была мысль уменьшить кол-во пулов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2015, 13:14     Out of memory imageLoader
Посмотрите здесь:

C++ Out of memory
Android Out of memory
Out of memory Delphi
Memory leak C++ WinAPI
Delphi Out of memory
nosql in-memory db
Memory Management Windows 7
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
27.11.2015, 15:44     Out of memory imageLoader #2
без шансов. Вы по-любому должны загрузить картинку полностью. а если она например гиг. Вы это узнаете, когда загрузите. Вы это не узнаете по размеру файла.
тема больная, сам полностью правильное решение не нашел. :-(
ExFau$t
167 / 150 / 29
Регистрация: 08.05.2012
Сообщений: 944
27.11.2015, 16:09  [ТС]     Out of memory imageLoader #3
bastrakov, ну а если предположить, что картинка не превышает, например, 1Мб. Другие просто-напросто браковать, помещая какую-нибудь дефолтную картинку.

Добавлено через 3 минуты
Тут даже не в размере дело, а в их количестве, logcat начинает мерцать красным лишь после продолжительной стабильной работы, все стандартные методы из readme по лоадеру вставил, но никакой разницы не заметил. Более того, если во время загрузки еще понажимать кнопочки, то приложение и вовсе валится.
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 724
27.11.2015, 16:23     Out of memory imageLoader #4
bastrakov, нет методов чтобы узнать сколько свободной памяти остается? не слышал про такое
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
27.11.2015, 17:09     Out of memory imageLoader #5
ExFau$t, а куда картинки то? Отображать их нужно или просто сохранять?
ExFau$t
167 / 150 / 29
Регистрация: 08.05.2012
Сообщений: 944
27.11.2015, 17:25  [ТС]     Out of memory imageLoader #6
Spelcrawler, сразу в imageview и на дисковый кэш, средствами лоадера, но могу рассмотреть и другие варианты, так как загрузить картинки мне надо в любом случае, а отобразить можно и позже.
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
27.11.2015, 17:37     Out of memory imageLoader #7
ExFau$t, есть куча библиотек для подобного, мне Glide понравилась, ее и гугл в примерах использует. Она может по url скачать картинку, закэшировать ее и отобразить. И все это в одну строку. При повторном вызове той же строки с тем же url подставляет картинку из кэша. Очень удобно и просто.
ExFau$t
167 / 150 / 29
Регистрация: 08.05.2012
Сообщений: 944
27.11.2015, 17:43  [ТС]     Out of memory imageLoader #8
Spelcrawler, а лоадер разве не так делает?

Добавлено через 4 минуты
Я проверял на небольшом количестве картинок, загружал, потом выключал интернет и запускал, картинки отображались как надо. Вот с большим количеством что-то не выходит, боюсь смена библиотеки не поможет.
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
27.11.2015, 19:04     Out of memory imageLoader #9
ExFau$t, ну не знаю у меня нормально работает с любым количеством картинок, кэш сам подчищается, если места нет. Плюс картинки режет под размер ImageView, что тоже снижает количество потребляемой памяти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2015, 17:24     Out of memory imageLoader
Еще ссылки по теме:

Java Cannot allocate memory
Delphi Out of memory
Out of memory Matlab
C++ WinAPI Create an in memory bitmap and draw directly to the memory
Android Imageloader in dcim

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

Или воспользуйтесь поиском по форуму:
ExFau$t
167 / 150 / 29
Регистрация: 08.05.2012
Сообщений: 944
28.11.2015, 17:24  [ТС]     Out of memory imageLoader #10
Spelcrawler, то же делает и imageloader, сжимает их еще. Ну что ж придется попробовать...

Добавлено через 21 минуту
Точно где-то косяк. Загрузил небольшое кол-во картинок, загрузилось, стал щелкать, ну тут процесс, что я в шапке написал, там подгружается дополнительно парочка картинок и текст, так вот начал щелкать и словил эту же ошибку. Вот набросал код для thread.
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
 public void Downl() {
        final AlertDialog alert;
        View view = act.getLayoutInflater().inflate(R.layout.dialog, null);
        Drawable dw = new IconicsDrawable(act)
                .icon(FontAwesome.Icon.faw_info)
                .color(Color.BLUE)
                .sizeDp(20);
        ImageView imageView = (ImageView) view.findViewById(R.id.imageViewInf);
        TextView tv = (TextView) view.findViewById(R.id.textDialog);
        tv.setText(R.string.Load);
        imageView.setImageDrawable(dw);
        AlertDialog.Builder builder = new AlertDialog.Builder(act);
        builder.setView(view);
        alert = builder.create();
        alert.show();
        final Handler myHandler = new Handler();
        Thread myThread = new Thread(new Runnable() {
            @Override
            public void run() {
                //загружаем
                Looper.prepare();
                myHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        //показываем (imageloader тоже тут)
                    }
 
                });
                alert.dismiss();
                Looper.loop();
            }
        });
        myThread.setPriority(4);
        myThread.start();
    }
Java
1
2
3
4
5
6
7
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
                .diskCacheExtraOptions(150, 150, null)
                .threadPoolSize(5)
                .threadPriority(Thread.MIN_PRIORITY)
                .build();
        imageLoader = ImageLoader.getInstance();
        imageLoader.init(config);
....
Java
1
2
3
4
5
6
final DisplayImageOptions displayOptions = new DisplayImageOptions.Builder()
                .cacheOnDisk(true)
                .imageScaleType(ImageScaleType.EXACTLY)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .build();
        imageLoader.displayImage(name, imageView,displayOptions);
Добавлено через 7 минут
По умолчанию кэша памяти нет, но такое ощущение, что именно он и переполняется

Добавлено через 4 часа 4 минуты
Spelcrawler, затестил эту либу, первое впечатление не очень, грузит картинку заметно дольше.

Добавлено через 17 часов 43 минуты
Решил забить на картинки, без них логику удалось переделать намного экономней.
Yandex
Объявления
28.11.2015, 17:24     Out of memory imageLoader
Ответ Создать тему
Опции темы

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