Как обрабатывать много просмотров изображений в Android без проблем с памятью?

#java #android #out-of-memory #android-imageview

#java #Android #нехватка памяти #android-imageview

Вопрос:

Я пытаюсь разработать простую карточную игру в Android Studio, в которую играют четыре игрока. Однако в самом начале я испытываю трудности. Я новичок в программировании на Android, но не в разработке Java.

Я просто хочу выполнить раздачу карт (раздачу карт), которая разделит 52 карты на каждого игрока, расположенного на ЗАПАДЕ, ЮГЕ, ВОСТОКЕ, СЕВЕРЕ на экране.

Итак, я догадался, что мне понадобится 52 просмотра изображений, представляющих карточки, поэтому я создал класс:

 public class Card extends ImageView {
  public Card(Context context, int id) {
    super(context);
    setImageResource(id);
  }
}
  

У меня есть статический массив строк с 52 элементами, представляющими имена карт, хэш-таблица, в которой для ключа указано имя карты, а для значения — объект Card, и у меня есть изображения всех карт в папке drawable с именами, аналогичными их именам в статическом массиве, поэтому я могу сопоставитьих.
Я пытаюсь сделать это в MainActivity:

 for (String cardName : cardNames) {
  int imageId = Utilities.getResId(cardName, R.drawable.class);//this just 
  //gets the id of the image in R
  Card card = new Card(this, imageId);
  cards.put(cardName, card);
  linearLayout.add(card);
}
  

Я также устанавливаю LinearLayout, который я заполняю выше, в представлении содержимого, вызывая метод:

 setContentView(linearLayout);
  

Ошибка, которую я получаю, это

 java.lang.OutOfMemoryError: Failed to allocate a 11675148 byte allocation with 10183056 free bytes and 9MB until OOM.
  

Эта ошибка возникает в цикле for примерно на 15-м цикле.

Теперь это, безусловно, кажется неправильным способом решения этой проблемы. Какой наилучший подход я должен использовать для такого рода игр? Изображения будут отображаться на экране в течение всего срока службы игры, а также будут простые анимации, например, выбор карты для броска и ее бросок.

Как справиться с этой ситуацией и каково решение, которое позволит избежать проблем с памятью во время игры в будущем?

Ответ №1:

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

Я думаю, что лучшим подходом было бы использовать RecylerView для решения этой проблемы, потому что RecyclerView имеет свой собственный способ управления памятью. Вы даже можете отобразить эти карты на экране, используя пользовательский LayoutManager (например, если их держать в руках). Два вертикальных RecyclerViews и два горизонтальных выполнят эту работу.

Если случайно это не сработало, попробуйте обернуть эти просмотры RecyclerView фрагментами.

Комментарии:

1. Спасибо, это выглядит многообещающе. Я попробую и отмечу это как ответ, если все получится так, как я хочу.

2. Я забыл упомянуть: попробуйте отключить три из них, которые отвечают за отображение карт противников. Потому что их перехват прокрутки может привести к возможному конфликту прокрутки.