3

Я начинаю с андроидом, и я пытаюсь создать приложение, которое покажет много изображений. Проблема в том, что когда я запускаю приложение и когда прокручиваю, приложение падает и показывает мне ошибку java.lang.OutOfMemoryError.android java.lang.OutOfMemoryError recyclerview с большим количеством изображений

Я использую андроидскую студию, minSdkVersion 15 и все фотографии не больше 20, 30 КБ, но у меня будет много изображений для показа. Все изображения находятся в папке ящика.

Это класс, где я добавляю все данные объекты, включая изображения:

package com.example.android.animalsoundsforchildren; 
 

 
import java.util.ArrayList; 
 

 

 
public class Zivotinje { 
 
    private String mAnimal_name; 
 
    private int mAnimal_slika; 
 
    private int mSound; 
 
    private String mkey; 
 

 

 
    public Zivotinje(String animalName, int slika, int sound, String key){ 
 
     this.setmAnimal_name(animalName); 
 
     this.setmAnimal_slika(slika); 
 
     this.setmSound(sound); 
 
     this.setMkey(key); 
 
    } 
 

 
    public String getmAnimal_name() { 
 
     return mAnimal_name; 
 
    } 
 

 
    public void setmAnimal_name(String mAnimal_name) { 
 
     this.mAnimal_name = mAnimal_name; 
 
    } 
 

 
    public int getmAnimal_slika() { 
 
     return mAnimal_slika; 
 
    } 
 

 
    public void setmAnimal_slika(int mAnimal_slika) { 
 
     this.mAnimal_slika = mAnimal_slika; 
 
    } 
 
    public int getmSound() { 
 
     return mSound; 
 
    } 
 

 
    public void setmSound(int mSound) { 
 
     this.mSound = mSound; 
 
    } 
 

 

 
    public String getMkey() { 
 
     return mkey; 
 
    } 
 

 
    public void setMkey(String mkey) { 
 
     this.mkey = mkey; 
 
    } 
 
    //static 
 
    public static ArrayList<Zivotinje> createZivotinjeList(){ 
 
     ArrayList<Zivotinje> zivotinje = new ArrayList<Zivotinje>(); 
 

 
     zivotinje.add(new Zivotinje("Sheep", R.drawable.domestic_sheep, R.raw.domestic_sheep, "Domestic")); 
 

 
     //ADING DATA TO ARRAY OF OBJECTS 
 
     zivotinje.add(new Zivotinje("Sparrow", R.drawable.birds_sparrow, R.raw.birds_sparrow, "Birds")); 
 
     zivotinje.add(new Zivotinje("Flamingo", R.drawable.birds_flamingo, R.raw.birds_flamingo, "Birds")); 
 
     zivotinje.add(new Zivotinje("Hyacinth Macaw", R.drawable.birds_hyacinth_macaw, R.raw.birds_hyacinth_macaw, "Birds")); 
 
     zivotinje.add(new Zivotinje("Kestrel", R.drawable.birds_kestrel, R.raw.birds_kestrel, "Birds")); 
 
     zivotinje.add(new Zivotinje("Pigeon", R.drawable.birds_pigeon, R.raw.birds_pigeon, "Birds")); 
 
     zivotinje.add(new Zivotinje("Seagull", R.drawable.birds_seagull, R.raw.birds_seagull, "Birds")); 
 
     zivotinje.add(new Zivotinje("Toucan", R.drawable.birds_toucan, R.raw.birds_toucan, "Birds")); 
 
     zivotinje.add(new Zivotinje("Swallow", R.drawable.birds_swallow, R.raw.birds_swallow, "Birds")); 
 

 
     zivotinje.add(new Zivotinje("Dolphin", R.drawable.sea_dolphin, R.raw.sea_dolphin, "Sea")); 
 
     zivotinje.add(new Zivotinje("Bumblebee", R.drawable.insects_bumblebee, R.raw.insects_bumblebee, "Insects")); 
 
     zivotinje.add(new Zivotinje("Tractor", R.drawable.cars_tractor, R.raw.cars_tractor, "Cars")); 
 
     zivotinje.add(new Zivotinje("Baby Cry", R.drawable.laugh_baby_cry, R.raw.laugh_baby_cray, "Laugh")); 
 
     zivotinje.add(new Zivotinje("Wind", R.drawable.nature_wind, R.raw.nature_wind, "Nature")); 
 
     zivotinje.add(new Zivotinje("Golf", R.drawable.effects_golf, R.raw.effects_golf, "Effects")); 
 
     zivotinje.add(new Zivotinje("Clock", R.drawable.others_clock, R.raw.others_clock, "Others")); 
 

 

 

 
     return zivotinje; 
 
    } 
 

 
    //Dohvacamo sve zivotinje i sortiramo specificne po kljucu tako da kad kliknemo recimo others pozove se ovo 
 
    public static ArrayList<Zivotinje> createZivotinjeListPero(String zivotinjeMenu) { 
 
     ArrayList<Zivotinje> zivotinje = new ArrayList<Zivotinje>(); 
 
     ArrayList<Zivotinje> zivotinjeLista = new ArrayList<Zivotinje>(); 
 

 
     zivotinje = createZivotinjeList(); 
 

 

 
     for (Zivotinje ziv : zivotinje) { 
 

 
      if (ziv.mkey == zivotinjeMenu) { 
 
       zivotinjeLista.add(ziv); 
 
      } 
 
     } 
 
     return zivotinjeLista; 
 
    } 
 

 
}

Это адаптер, я думаю, мне нужно решать проблемы в onbindviewholder метод, но я не знаю, как :

package com.example.android.animalsoundsforchildren; 
 

 
import android.content.Context; 
 
import android.media.MediaPlayer; 
 
import android.support.v7.widget.RecyclerView; 
 
import android.view.LayoutInflater; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 
import android.widget.ImageView; 
 
import android.widget.TextView; 
 

 
import java.util.List; 
 

 

 
public class ZivotinjeAdapter extends RecyclerView.Adapter<ZivotinjeAdapter.ViewHolder> { 
 

 
    @Override 
 
    public ZivotinjeAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
 
     Context context = parent.getContext(); 
 
     LayoutInflater inflater = LayoutInflater.from(context); 
 

 
     // Inflate the custom layout 
 
     View contactView = inflater.inflate(R.layout.item_zivotinje, parent, false); 
 

 
     // Return a new holder instance 
 
     ViewHolder viewHolder = new ViewHolder(contactView); 
 
     return viewHolder; 
 
    } 
 

 
    @Override 
 
    public void onBindViewHolder(ZivotinjeAdapter.ViewHolder viewHolder, int position) { 
 

 
     Zivotinje zivotinjeIme = mZivotinje.get(position); 
 

 
     // Set item views based on the data model 
 
     TextView textView = viewHolder.nameTextView; 
 
     textView.setText(zivotinjeIme.getmAnimal_name()); 
 

 
     //THIS IS WHERE I HANDALE IMAGE VIEW 
 
     ImageView slika_source = viewHolder.imageView; 
 
     slika_source.setImageResource(zivotinjeIme.getmAnimal_slika()); 
 

 
     
 
     viewHolder.setItem(mZivotinje.get(position)); 
 

 

 

 
    } 
 

 

 
    @Override 
 
    public int getItemCount() { 
 
     return mZivotinje.size(); 
 
    } 
 

 
    public static class ViewHolder extends RecyclerView.ViewHolder { 
 

 
     public ImageView imageView; 
 
     public TextView nameTextView; 
 
     private Zivotinje mItem; 
 

 

 

 
     public void setItem(Zivotinje item) { 
 
      this.mItem = item; 
 
     } 
 

 

 

 
     public ViewHolder(final View itemView) { 
 
      super(itemView); 
 

 
      nameTextView = (TextView) itemView.findViewById(R.id.zivotinjaIme_id); 
 
      imageView = (ImageView) itemView.findViewById(R.id.slika_id); 
 

 

 

 

 

 

 

 
      itemView.setOnClickListener(new View.OnClickListener() { 
 

 
       @Override 
 
       public void onClick(View v) { 
 
        MediaPlayer mediaPlayer = MediaPlayer.create(v.getContext(), mItem.getmSound()); 
 
        mediaPlayer.start(); 
 
       } 
 
      }); 
 

 
     } 
 

 

 
    } 
 

 
    private List<Zivotinje> mZivotinje; 
 

 
    public ZivotinjeAdapter(List<Zivotinje> animals) { 
 
     mZivotinje = animals; 
 
    } 
 
}

+0

*** общественности статической ArrayList createZivotinjeList() {*** и *** общественности статической ArrayList createZivotinjeListPero (String zivotinjeMenu) {*** Попробуйте Называйте это в OnCreate в MainActivity.class –

ответ

2

Вы должны использовать загрузку библиотеку изображений для загрузки изображений,

Вашего получения ООГО из-за разрешением изображений.

Есть много библиотек для загрузки изображений, но я предпочитаю Glide. его лучше, чем другие, во многих отношениях,

Это решит вашу проблему ООМ

Здесь использование

ImageView slika_source = viewHolder.imageView; 
Glide.with(mContext) 
      .load((Integer) zivotinjeIme.getmAnimal_slika())     
      .into(slika_source); 
+0

. Я попытаюсь научиться этому. Я не про и андроид, только начинаю недавно. Надеюсь, это будет не сложно. – beginner

+0

Я просто все это делаю, я импортирую библиотеку. Сейчас это немного лучше.На этот раз я могу прокручивать вниз, но когда я иду, чтобы прокрутить назад, он снова падает. Это то, что я сделал в методе oncreateview – beginner

+0

Теперь он работает, я не поставил ваш код в правильном направлении. СПАСИБО ТЕБЕ ЗА ЭТО – beginner

0

Вы можете использовать android:largeHeap="true" в AndroidManifest.xml.

<application 
    android:largeHeap="true"> 
+0

Спасибо. Я просто попробую, и приложение все равно будет разбито – beginner

2

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

попытаться использовать ...

1). Универсальный загрузчик изображений

2). Пикассо (официальная ссылка: http://square.github.io/picasso/)

3). Скольжение (Github Ссылка: https://github.com/bumptech/glide)

и с этим все не забудьте добавить разрешение в файле манифеста вашего проекта ...

андроида: hardwareAccelerated = «истинный» и андроид: largeHeap = "истинный "

Смежные вопросы