Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 1
Регистрация: 11.07.2013
Сообщений: 136

Как правильно загружать изображения?

21.07.2016, 13:21. Показов 2096. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разрабатываю приложение для игры. Уже выпустил тестовую версию и из первой сотни установивших у двух человек вылезла такая ошибка:

Кликните здесь для просмотра всего текста

java.lang.OutOfMemoryError: Failed to allocate a 5266956 byte allocation with 42576 free bytes and 41KB until OOM
at dalvik.system.VMRuntime.newNonMovableArr ay(Native Method)
at android.graphics.BitmapFactory.nativeDec odeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStr eam(BitmapFactory.java:655)
at android.graphics.BitmapFactory.decodeRes ourceStream(BitmapFactory.java:488)
at android.graphics.drawable.Drawable.creat eFromResourceStream(Drawable.java:978)
at android.content.res.Resources.createFrom ResourceStream(Resources.java:3026)
at android.content.res.Resources.loadDrawab leForCookie(Resources.java:2721)
at android.content.res.Resources.loadDrawab le(Resources.java:2607)
at android.content.res.MiuiResources.loadDr awable(MiuiResources.java:393)
at android.content.res.TypedArray.getDrawab le(TypedArray.java:751)
at android.widget.ImageView.<init>(ImageVie w.java:146)
at android.widget.ImageView.<init>(ImageVie w.java:135)
at android.support.v7.widget.AppCompatImage View.<init>(AppCompatImageView.java:57)
at android.support.v7.widget.AppCompatImage View.<init>(AppCompatImageView.java:53)
at android.support.v7.app.AppCompatViewInfl ater.createView(AppCompatViewInflater.ja va:106)
at android.support.v7.app.AppCompatDelegate ImplV7.createView(AppCompatDelegateImplV 7.java:1008)
at android.support.v7.app.AppCompatDelegate ImplV7.onCreateView(AppCompatDelegateImp lV7.java:1067)
at android.support.v4.view.LayoutInflaterCo mpatHC$FactoryWrapperHC.onCreateView(Lay outInflaterCompatHC.java:44)
at android.view.LayoutInflater.createViewFr omTag(LayoutInflater.java:729)
at android.view.LayoutInflater.rInflate(Lay outInflater.java:810)
at android.view.LayoutInflater.rInflate(Lay outInflater.java:813)
at android.view.LayoutInflater.inflate(Layo utInflater.java:508)
at android.view.LayoutInflater.inflate(Layo utInflater.java:418)
at android.view.LayoutInflater.inflate(Layo utInflater.java:365)
at android.support.v7.app.AppCompatDelegate ImplV7.setContentView(AppCompatDelegateI mplV7.java:280)
at android.support.v7.app.AppCompatActivity .setContentView(AppCompatActivity.java:1 40)
at agentz.com.soulhuntersapp.Info.onCreate( Info.java:27)
at android.app.Activity.performCreate(Activ ity.java:5975)
at android.app.Instrumentation.callActivity OnCreate(Instrumentation.java:1111)
at android.app.ActivityThread.performLaunch Activity(ActivityThread.java:2417)
at android.app.ActivityThread.handleLaunchA ctivity(ActivityThread.java:2526)
at android.app.ActivityThread.access$800(Ac tivityThread.java:169)
at android.app.ActivityThread$H.handleMessa ge(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handl er.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(Activity Thread.java:5549)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.j ava:372)
at com.android.internal.os.ZygoteInit$Metho dAndArgsCaller.run(ZygoteInit.java:964)
at com.android.internal.os.ZygoteInit.main( ZygoteInit.java:759)


Я стал изучать этот вопрос более тщательно и понял, что изображения надо как-то оптимизировать... У меня в ресурсах изображений более 500 штук, каждое примерно 500х900 и по 100-200кб.
Я еще не знаю все нюансы программирования для андроид и для изображений использовал массивы int[][], в которые загружаются картинки с ресурсов и в нужные моменты по индексу загружаются в нужный ImageView методом .setImageResource(array1[int][int]);

Вот, например, так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 if (!Hero.awake[ID]) 
{
            s5.setVisibility(View.GONE);
            layoutSkill5.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0f));
 
            picHero.setImageResource    (Hero.img[ID][1]);
 
        } else {
            Hero leg = new Hero(this);
            leg.createLegPics(); //Создание массива с изображениями легендарных героев
 
            picHero.setImageResource(Hero.imgLeg[ID]);
            s5.setImageResource     (Hero.img[ID][6]);
        }
 
 
        s1.setImageResource         (Hero.img[ID][2]);
        s2.setImageResource         (Hero.img[ID][3]);
        s3.setImageResource         (Hero.img[ID][4]);
        s4.setImageResource         (Hero.img[ID][5]);
 
        tvName.setText                 (Hero.hero[ID][0]);
        tvDescription.setText          (Hero.hero[ID][9]);

Лично у меня на девайсе и еще у сотни человек такой ошибки не было. Но у двоих такая вот беда. Я понял, что есть косяк. Хочу попросить помощи в правильной прогрузке изображений. Если это дело не пары секунд, то могу заплатить.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.07.2016, 13:21
Ответы с готовыми решениями:

Как правильно загружать изображение и Bitmap compress при большом объеме фото
Друзья и коллеги, такой вопрос у меня. Совсем не давно начал постигать программирование под андроид и при написании тестового приложения...

Как правильно загружать изображения?
Есть БД Access, Есть DBGrid с таблицой, в таблице есть столбик для фотографий(Поле MEMO). Собственно как загружать в него разные...

Как загружать изображения в дос-программы
как загружать изображения в дос-программы? Кроме как объявлять каждый пиксель? Возможно ли это?

12
 Аватар для OlegJV
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
21.07.2016, 14:46
Из ресурсов в массив, из массива в ImageView. A почему не из ресурсов в ImageView? Зачем посредники?
0
0 / 0 / 1
Регистрация: 11.07.2013
Сообщений: 136
21.07.2016, 15:02  [ТС]
OlegJV, чтобы можно было перебрать по имени и при совпадении выставить ID, с помощью которого я уже беру из всех массивов нужную информацию по нужному ID. Я не придумал, как это можно сделать не массивом =(

Добавлено через 7 минут
Я ведь не могу при каждом запросе делать if (name==ivan) pic.setImageResource(R.drawable.ivan) и так далее на каждую картинку. Либо я чего-то не знаю, подскажите плиз
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
22.07.2016, 20:57
AgentZ, научитесь пользоваться кэширующими библиотеками для изображений: Glide, Fresco, Picasso.
Изучите Soft Reference. Не используйте массивы в Яве, это очень неудобный способ программирования, используйте коллекции.
1
0 / 0 / 1
Регистрация: 11.07.2013
Сообщений: 136
23.07.2016, 12:19  [ТС]
CoolMind, Спасибо, буду пробовать.
Насчет Picasso: Я правильно понимаю, что вместо "imageview.setImageResource(Hero.img[1][0])" мне нужно использовать "Picasso.with(Main.this).load(Hero.img[1][0]).into(imageview)"? (Сейчас опускаю массивы, с коллекциями буду разбираться)
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
23.07.2016, 15:11
Лучший ответ Сообщение было отмечено AgentZ как решение

Решение

AgentZ, не за что! Я уже не помню порядок инициализации и использования, но, скорее всего, вы правы, там библиотека сама решает, как именно загружать изображение.
1
25.07.2016, 02:41

Не по теме:

Цитата Сообщение от CoolMind Посмотреть сообщение
Не используйте массивы в Яве, это очень неудобный способ программирования,
это как понять? Просто до жути стало интересно

0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
25.07.2016, 07:06
Цитата Сообщение от petruchodd Посмотреть сообщение
это как понять? Просто до жути стало интересно
Вы знакомы с коллекциями? А ведь с ними надо выполнять какие-то действия: добавлять, убавлять, менять. Массивы для этого совершенно не приспособлены. ArrayList практически такой же по скорости чтения, а вот операции над ним выполняются в разы проще.
0
0 / 0 / 1
Регистрация: 11.07.2013
Сообщений: 136
26.07.2016, 11:03  [ТС]
CoolMind, хм, если только в этом суть, может тогда мне не заморачиваться? Ведь в работе приложения у меня уже готовые списки. Если в них и нужно что-то добавлять, то это происходит параллельно с добавлением новых ресурсов - изображений и ещё всякой ерунды ) что собственно я и делаю, выпуская обновление в Гугл плей.
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
26.07.2016, 13:01
Цитата Сообщение от AgentZ Посмотреть сообщение
может тогда мне не заморачиваться?
Можете не заморачиваться. Если в дальнейшем будете делать какие-то операции с массивами, изучите коллекцию ArrayList.
1
0 / 0 / 1
Регистрация: 11.07.2013
Сообщений: 136
26.07.2016, 15:17  [ТС]
CoolMind, Да, я уже разобрался достаточно с ArrayList. Действительно работать с ним удобно. Но в данный момент мне нужны статические списки ) Спасибо
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
26.07.2016, 15:34
для каждого случая - своё
если количество элементов постоянное - массив, если нет - лист

массив на 10000 int-ов
и ArrayList на 10000 Integer-ов разница будет ощутимая
десять тысяч объектов вместо одного (массива) + доступ к элементам в листе через get полюбому на децл медленнее чем напрямую к элементам массива

ну и есть еще случаи когда нужны двух или трехерные массивы
кто-нибудь рискнет писать это на листах?
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
26.07.2016, 15:42
Цитата Сообщение от Паблито Посмотреть сообщение
ну и есть еще случаи когда нужны двух или трехерные массивы
кто-нибудь рискнет писать это на листах?
Тоже над этим думал.
Если массивы растут по каждому измерению, то, пожалуй, только на листах и надо писать.

Добавлено через 2 минуты
Но могу ошибаться, смотря, как сделать на массивах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.07.2016, 15:42
Помогаю со студенческими работами здесь

Как правильно загружать БД SQL на хостинг?
При импорте БД на хост на другой БД выдает ошибку. Как решить проблему? Ошибка SQL-запрос: -- -- Dumping data for table...

Как правильно загружать и раздавать видео?
В общем, хочу сделать онлайн кинотеатр, и хотелось бы загружать фильмы на свой хостинг. Только вот не знаю как загружать их с чужих сайтов...

Как правильно в цикле загружать матрицы под разными именами
Добрый день! Подскажите пожалуйста как правильно в цикле загружать матрицы под разными именами. При помощи интерактивного импорта...

Запретить webbrowser загружать изображения?
Как запретить webbrowser загружать изображения?

Как "по учебнику" загружать правильно iptables в Ubuntu?
С одной стороны, есть скрипт правил iptables (для chillispot). В Mandriva &quot;борьба&quot; с ними выглядит так - сначала сбрасываем iptables в...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru