2017-03-17 56 views
2

我有一個問題,從數據庫恢復圖像到Android使用類型byte []和我們傳遞ArrayList圖像到我們使用Glide的適配器,但我可以恢復超過20個圖像的數據庫使用服務Web PHP,應用程序返回異常「內存不足!!」例外從Android的內存

我希望你能幫助我找到一個解決這個problemI多試解決方案的更多,但我仍然有問題

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.MyTag> 
{ 
LayoutInflater inflater; 
DbConnection db ; 
CnxExternal myConex = new CnxExternal(); 
ArrayList<Map<String, String>> listitem; 
private CardAdapter.MyTag holder; 
Context ctx; 
ArrayList<byte[]> img , imgfou ; 
ArrayList<String>nomesFo,descriptions; 
String codeBar; 
ArrayList<Integer>idfourns; 



public CardAdapter(Context context, ArrayList<Map<String, String>> list,ArrayList<byte[]>imagbyt,ArrayList<String>names,ArrayList<Integer>idf,String cod,ArrayList<String>Description,ArrayList<byte[]>imagfour) { 
    super(); 
    this.inflater = LayoutInflater.from(context); 
    this.listitem = list; 
    ctx=context; 
    this.img=imagbyt; 
    this.nomesFo=names; 
    this.idfourns=idf; 
    this.codeBar=cod; 
    this.imgfou=imagfour; 
    this.descriptions=Description; 
    db =new DbConnection(ctx); 

} 

public class MyTag extends RecyclerView.ViewHolder { 
    TextView price; 
    TextView name; 
    ImageView img; 
    TextView namfou; 
    TextView rating; 
    FloatingActionButton btnlike; 

    CardView cardView; 
    public MyTag(View view) { 
     super(view); 
     //for animat 
cardView=(CardView)view.findViewById(R.id.card_view); 

     price = (TextView) view.findViewById(R.id.prixprodtestcard); 
     name = (TextView) view.findViewById(R.id.nomprodtestcard); 
     namfou=(TextView) view.findViewById(R.id.qtestockcard); 
     rating=(TextView)view.findViewById(R.id.rating); 
     img = (ImageView) view.findViewById(R.id.imageprodcard); 
     btnlike = (FloatingActionButton) view.findViewById(R.id.likeButtoncard); 
} 
} 


@Override 
public MyTag onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, null); 

    return new MyTag(v); 
} 


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


@Override 
public void onViewRecycled(MyTag holder) { 
    super.onViewRecycled(holder); 
    Glide.clear(holder.img); 
} 

public void onBindViewHolder(final MyTag holder, final int position) { 

    //anim fadein 
    YoYo.with(Techniques.SlideInUp) 
      .playOn(holder.cardView); 

    final HashMap<String, String> map = (HashMap<String, String>)listitem.get(position); 


    if(map.get("like").equals("0")){ 
     holder.btnlike.setImageResource(R.drawable.heart); 
    }else{ 
     holder.btnlike.setImageResource(R.drawable.ic_liked); 

    } 
    holder.img.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(ctx,InformationsProduit.class); 
      i.putExtra("nomProd",map.get("name")); 
      i.putExtra("prix",map.get("price")); 
      i.putExtra("nomFour",nomesFo.get(position)); 
      i.putExtra("image",img.get(position)); 
      i.putExtra("telFour",map.get("telefournisseur")); 
      i.putExtra("addrFour",map.get("adressFou")); 
      i.putExtra("idFour",idfourns.get(position)); 
      i.putExtra("description",descriptions.get(position)); 
      i.putExtra("codeBar",codeBar); 
      ctx.startActivity(i); 
     } 
    }); 

    holder.price.setText(map.get("price")); 
    holder.name.setText(map.get("name")); 
    holder.namfou.setText(nomesFo.get(position)); 
    holder.rating.setText(map.get("rating")); 


    Glide.with(ctx) 
      .load(imgfou.get(position)) 
      //.diskCacheStrategy(DiskCacheStrategy.NONE) 
      //.skipMemoryCache(true) 
      .thumbnail(0.1f) 
      .into(holder.img); 


    holder.btnlike.setOnClickListener(new View.OnClickListener() { 
     CardAdapter.MyTag hld=holder; 
     int pos=position; 
     @Override 
     public void onClick(View arg0) { 

      HashMap<String, String> mapclicked = (HashMap<String, String>)listitem.get(pos); 
      if(mapclicked.get("like").equals("0")) 
      { 
       hld.btnlike.setImageResource(R.drawable.ic_liked); 
       mapclicked.put("like", "1"); 


       Snackbar snackbar; 
       snackbar = Snackbar.make(hld.btnlike, "Bien ajouter au prefere", Snackbar.LENGTH_SHORT); 
       View snackBarView = snackbar.getView(); 
       snackBarView.setBackgroundColor(Color.GREEN); 
       TextView textView = (TextView) snackBarView.findViewById(android.support.design.R.id.snackbar_text); 
       textView.setTextColor(Color.WHITE); 
       snackbar.show(); 

       db.insertFav(codeBar,idfourns.get(pos) , map.get("name") , map.get("price") , nomesFo.get(position) , map.get("adressFou") , map.get("telefournisseur") ,img.get(position)); 

       hld.btnlike.startAnimation(animAdp()); 

      }else{ 
       hld.btnlike.setImageResource(R.drawable.heart); 
       mapclicked.put("like", "0"); 

     Snackbar.make(hld.btnlike, "Removed from prefere" , Snackbar.LENGTH_LONG).setAction("Action", null).show(); 

       db.deleteR(codeBar,idfourns.get(pos)); 
       hld.btnlike.startAnimation(animAdp()); 
      } 
     }} 
    ); 



} 
+1

如果您試圖一起獲取所有圖像,並且圖像很大 - 那麼可能是因爲這一次調用而導致內存不足。如果不是,請嘗試撥打個別電話以獲取每張圖片。 –

+0

@ jack-hardcastle數據庫中的數據帶來的問題或圖像的大小有可能存在問題 –

+0

顯示您的代碼! – Raptor

回答

0

AndroidManifest.xml添加這個標籤<Application>內:

android:hardwareAccelerated="false" 
android:largeHeap="true" 
+0

這不適合我! –

+0

在你的圖片陣列中,嘗試使用ArrayList 並使用圖片的位圖 –

+0

我有這樣的情況,這個東西適用於我,也許他們爲你工作:) –