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

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

Войти
Регистрация
Восстановить пароль
 
AgentZ
0 / 0 / 0
Регистрация: 11.07.2013
Сообщений: 105
#1

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

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

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

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

java.lang.OutOfMemoryError: Failed to allocate a 5266956 byte allocation with 42576 free bytes and 41KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:655)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:488)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:978)
at android.content.res.Resources.createFromResourceStream(Resources.java:3026)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:2721)
at android.content.res.Resources.loadDrawable(Resources.java:2607)
at android.content.res.MiuiResources.loadDrawable(MiuiResources.java:393)
at android.content.res.TypedArray.getDrawable(TypedArray.java:751)
at android.widget.ImageView.<init>(ImageView.java:146)
at android.widget.ImageView.<init>(ImageView.java:135)
at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:57)
at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:53)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:1008)
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1067)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:729)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:810)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
at android.view.LayoutInflater.inflate(LayoutInflater.java:508)
at android.view.LayoutInflater.inflate(LayoutInflater.java:418)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
at agentz.com.soulhuntersapp.Info.onCreate(Info.java:27)
at android.app.Activity.performCreate(Activity.java:5975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2526)
at android.app.ActivityThread.access$800(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5549)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.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]);

Лично у меня на девайсе и еще у сотни человек такой ошибки не было. Но у двоих такая вот беда. Я понял, что есть косяк. Хочу попросить помощи в правильной прогрузке изображений. Если это дело не пары секунд, то могу заплатить.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2016, 13:21     Как правильно загружать изображения?
Посмотрите здесь:

Как сделать изображения не через data:uri Android
Несколько фонов для приложения. Как загружать каждый по его номеру в имени файла Android
Android Как правильно парсить?
Как загружать/хранить файл в SQLite? Android
Как получить характеристики изображения перед выводом? Android
Android Как удобнее загружать огромный массив в приложение?
Как загружать картинки на стену Вконтакте? Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
21.07.2016, 14:46     Как правильно загружать изображения? #2
Из ресурсов в массив, из массива в ImageView. A почему не из ресурсов в ImageView? Зачем посредники?
AgentZ
0 / 0 / 0
Регистрация: 11.07.2013
Сообщений: 105
21.07.2016, 15:02  [ТС]     Как правильно загружать изображения? #3
OlegJV, чтобы можно было перебрать по имени и при совпадении выставить ID, с помощью которого я уже беру из всех массивов нужную информацию по нужному ID. Я не придумал, как это можно сделать не массивом =(

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

Не по теме:

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

CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
25.07.2016, 07:06     Как правильно загружать изображения? #8
Цитата Сообщение от petruchodd Посмотреть сообщение
это как понять? Просто до жути стало интересно
Вы знакомы с коллекциями? А ведь с ними надо выполнять какие-то действия: добавлять, убавлять, менять. Массивы для этого совершенно не приспособлены. ArrayList практически такой же по скорости чтения, а вот операции над ним выполняются в разы проще.
AgentZ
0 / 0 / 0
Регистрация: 11.07.2013
Сообщений: 105
26.07.2016, 11:03  [ТС]     Как правильно загружать изображения? #9
CoolMind, хм, если только в этом суть, может тогда мне не заморачиваться? Ведь в работе приложения у меня уже готовые списки. Если в них и нужно что-то добавлять, то это происходит параллельно с добавлением новых ресурсов - изображений и ещё всякой ерунды ) что собственно я и делаю, выпуская обновление в Гугл плей.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
26.07.2016, 13:01     Как правильно загружать изображения? #10
Цитата Сообщение от AgentZ Посмотреть сообщение
может тогда мне не заморачиваться?
Можете не заморачиваться. Если в дальнейшем будете делать какие-то операции с массивами, изучите коллекцию ArrayList.
AgentZ
0 / 0 / 0
Регистрация: 11.07.2013
Сообщений: 105
26.07.2016, 15:17  [ТС]     Как правильно загружать изображения? #11
CoolMind, Да, я уже разобрался достаточно с ArrayList. Действительно работать с ним удобно. Но в данный момент мне нужны статические списки ) Спасибо
Паблито
2011 / 1753 / 545
Регистрация: 12.05.2014
Сообщений: 6,207
Завершенные тесты: 1
26.07.2016, 15:34     Как правильно загружать изображения? #12
для каждого случая - своё
если количество элементов постоянное - массив, если нет - лист

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

ну и есть еще случаи когда нужны двух или трехерные массивы
кто-нибудь рискнет писать это на листах?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2016, 15:42     Как правильно загружать изображения?
Еще ссылки по теме:

Как программно узнать глубину цвета изображения? Android
Как в ячейке TableLayout совместить два изображения? Android
Как сделать границы в пространстве ImageView при прокрутке изображения Android
Как увеличивать изображения Android
Android Как при появлении Wifi загружать данные

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

Или воспользуйтесь поиском по форуму:
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
26.07.2016, 15:42     Как правильно загружать изображения? #13
Цитата Сообщение от Паблито Посмотреть сообщение
ну и есть еще случаи когда нужны двух или трехерные массивы
кто-нибудь рискнет писать это на листах?
Тоже над этим думал.
Если массивы растут по каждому измерению, то, пожалуй, только на листах и надо писать.

Добавлено через 2 минуты
Но могу ошибаться, смотря, как сделать на массивах.
Yandex
Объявления
26.07.2016, 15:42     Как правильно загружать изображения?
Ответ Создать тему
Опции темы

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