3

私はアンドロイドの初心者ですから、たくさんの画像を表示するアプリを作ろうとしています。問題は、私がアプリケーションを実行し、私がスクロールしているとき、アプリケーションがクラッシュし、エラーjava.lang.OutOfMemoryErrorを表示することです。android java.lang.OutOfMemoryError recyclerviewたくさんの画像を持っています

私はアンドロイドスタジオ、minSdkVersion 15を使用しています。すべての画像は20,30 KBより大きくはありませんが、表示する画像はたくさんあります。すべての画像は引き出しフォルダにあります。

これは私が画像を含むオブジェクトへのすべてのデータを追加したクラスです。これは、アダプタで

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

***のpublic static ArrayListを createZivotinjeList(){*** と***のpublic static ArrayListを createZivotinjeListPero(文字列zivotinjeMenu){*** ありがとうMainActivity.class –

答えて

2

あなたはあなたのために、画像の解像度のOOMを取得

、イメージをロードするために画像の読み込みライブラリを使用する必要があります。

多くの画像読み込みライブラリがありますが、私はGlideを好んでいます。これは、ビットマップ(画像)のロットの荷重で作業しながら、ここでOOM

のあなたの問題は、使用ほとんど

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

私はこれを行う方法を学ぶしようとします。 Imはアンドロイドでプロではなく、ちょうど最近始まります。それが難しくないことを願っています。 – beginner

+0

私はこれをすべてやって、私はライブラリをインポートします。今は少し良くなっています。今回私はスクロールダウンできますが、スクロールバックに行くと再びクラッシュします。これは私がoncreateviewメソッドで行ったことです – beginner

+0

現在、私は正しい方法でコードを書いていません。これありがとう – beginner

0

android:largeHeap="true"AndroidManifest.xmlに使用できます。

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

にOnCreateイベントでそれを呼び出してみてください。私はそれを試して、アプリはまだ墜落する – beginner

2

で解決します

、多くの点で他のものよりその優れた第三を使用しよう適切なメモリ管理、メモリクリア、すべてのコンセプトに基づいて作業しているため、パーティツール/ライブラリは非常に難しい作業です。

お試しください...

1)。ユニバーサル画像ローダー

2)。ピカソ(公式リンク:http://square.github.io/picasso/

3)。グライド(GitHubのリンク:https://github.com/bumptech/glide

とすべてのものは、あなたのプロジェクトのマニフェストファイルにアクセス権を追加することを忘れないでください。このと...

アンドロイド:hardwareAccelerated =「真」とAndroid:largeHeapは=「真「

関連する問題