0

UPDATE : 이미지로 제작 한 후 2012년 10월 12일메모리 오버 플로우 안드로이드

:

WeakHashMap<Bitmap, WeakReference<Bitmap>> objReferenciaDebilBitmaps; 
Bitmap imagen = datossss.getImagen(); 
objreCReferencias.RegristrarReferenciaDebilBitmap(imagen, objReferenciaDebilBitmaps); 

내 수업 Creferencias

public class CReferencias { 


public CReferencias(){ 

} 

public void RegristrarReferenciaDebilBitmap(Bitmap img, WeakHashMap<Bitmap, WeakReference<Bitmap>> objReferenciaDebilBitmaps){ 
    WeakReference<Bitmap> objrererencia1 = new WeakReference<Bitmap>(img); 
    objReferenciaDebilBitmaps.put(img, objrererencia1); 

} 

내가 생성 할이 때마다 사용 후 비트 맵에 약한 참조를 사용하는 것이 올바른지 잘 모르겠습니다.

하지만 여전히 나에게

sigiente 문제를 제공이 내 로그 캣입니다

12-10 13:54:53.523: E/dalvikvm-heap(1211): Out of memory on a 2304016-byte allocation. 
12-10 13:54:53.528: E/AndroidRuntime(1211): FATAL EXCEPTION: main 
12-10 13:54:53.528: E/AndroidRuntime(1211): java.lang.OutOfMemoryError 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.graphics.Bitmap.nativeCreate(Native Method) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.graphics.Bitmap.createBitmap(Bitmap.java:605) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.graphics.Bitmap.createBitmap(Bitmap.java:551) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at dep.Agenda.CustomAdapterDetalleEventos.getView(CustomAdapterDetalleEventos.java:558) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.widget.AbsListView.obtainView(AbsListView.java:2201) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.widget.ListView.makeAndAddView(ListView.java:1774) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.widget.ListView.fillUp(ListView.java:705) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.widget.ListView.fillGap(ListView.java:645) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5263) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.widget.AbsListView$TwFlingRunnable.run(AbsListView.java:4156) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.os.Handler.handleCallback(Handler.java:605) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.os.Handler.dispatchMessage(Handler.java:92) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.os.Looper.loop(Looper.java:137) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at android.app.ActivityThread.main(ActivityThread.java:4507) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
12-10 13:54:53.528: E/AndroidRuntime(1211):  at dalvik.system.NativeStart.main(Native Method) 

이 난거야 그 라인 내 어댑터

public View getView(final int position, View convertView, ViewGroup parent){ 
     View vistaFila =null; 

    final ElementosLinea objelementos;//=null; 

     //final ElementosLinea obj; 
     //final View auxVistaFila=null; 


    LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (convertView == null) { 
      // LayoutInflater inflator = context.getLayoutInflater(); 


      //LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      vistaFila = vi.inflate(R.layout.ll_lineas_lista_detalle_evento_nueva, null); 

      //AsignarElementos(vistaFila); 

      objelementos = new ElementosLinea(); 
      AsignarElementos(vistaFila,objelementos); 




     vistaFila.setTag(objelementos); 
     objelementos.posicion= position; 

     }else{ 
      //vistaFila = vi.inflate(R.layout.ll_lineas_lista_detalles_evento, null); 
      vistaFila=convertView; 
      objelementos=(ElementosLinea)convertView.getTag(); 
      objelementos.posicion= position; 
     } 

     DetalleEvento datossss = arrayDatos.get(position); 

     if (datossss.getGusta()==0){ 

      objelementos.btnMegusta.setBackgroundResource(R.drawable.megustagris); 
      objelementos.txtMegusta.setText("Me gusta"); 
     }else{ 
      objelementos.btnMegusta.setBackgroundResource(R.drawable.megustaazul); 
      objelementos.txtMegusta.setText("No me gusta"); 
      } 


     //llenamos la barra de progreso 
    if (datossss.getTipo()==1){//SI ES UN VIDEO 

     objelementos.txtTitulo.setText(datossss.getTituloPost()); 
     objelementos.txtAutor.setText(datossss.getAutor()); 
     objelementos.txtPost.setVisibility(View.INVISIBLE); 

     if (datossss.getImagen()!=null){ 
      Bitmap imagen = datossss.getImagen(); 
      objreCReferencias.RegristrarReferenciaDebilBitmap(imagen, objReferenciaDebilBitmaps); 
      int width = imagen.getWidth(); 
       int height = imagen.getHeight(); 
       int newWidth = activiadPricipal.getWindowManager().getDefaultDisplay().getWidth(); 
       int newHeight = newWidth-80; 

       float scalarw=((float) newWidth) /width; 
       float scalarh=((float) newHeight) /height; 

      Matrix ma = new Matrix(); 
      ma.postScale(scalarw, scalarh); 

      Bitmap res = Bitmap.createBitmap(imagen, 0, 0, 
        width, height, ma, true); 
     objreCReferencias.RegristrarReferenciaDebilBitmap(res, objReferenciaDebilBitmaps); 
     objelementos.imgfotoVideo.setImageBitmap(res); 
     //imagen.recycle(); 
     //res.recycle(); 
     objelementos.btnComentarios.setEnabled(true); 
     objelementos.pgrprogreso.setVisibility(View.INVISIBLE); 

     }else{ 


       int newWidth = activiadPricipal.getWindowManager().getDefaultDisplay().getWidth(); 
       int newHeight = newWidth-80; 

       objelementos.imgfotoVideo.setImageBitmap(null); 
       objelementos.imgfotoVideo.setMinimumHeight(newHeight); 
       objelementos.imgfotoVideo.setMinimumWidth(newWidth); 
       objelementos.pgrprogreso.setVisibility(View.VISIBLE); 
     objelementos.btnComentarios.setEnabled(false); 
     } 
     objelementos.imgfotoVideo.setVisibility(View.VISIBLE); 
     objelementos.btnVerVideo.setVisibility(View.VISIBLE); 
     objelementos.txtFecha.setText(datossss.getFecha()); 
     objelementos.btnVerfoto.setVisibility(View.INVISIBLE); 




    }else{ if (datossss.getTipo()==2){ //SI ES UN POST 

     objelementos.txtTitulo.setText(datossss.getTituloPost()); 
     objelementos.txtAutor.setText(datossss.getAutor()); 
     objelementos.txtPost.setText(datossss.getTexto()); 
     objelementos.txtPost.setVisibility(View.VISIBLE); 
     objelementos.imgfotoVideo.setVisibility(View.INVISIBLE); 
     objelementos.imgfotoVideo.setImageBitmap(null); 
     objelementos.btnVerVideo.setVisibility(View.INVISIBLE); 
     objelementos.txtFecha.setText(datossss.getFecha()); 
     objelementos.btnVerfoto.setVisibility(View.INVISIBLE); 
     objelementos.btnComentarios.setEnabled(true); 

     objelementos.imgfotoVideo.setMinimumHeight(0); 
      objelementos.imgfotoVideo.setMinimumWidth(0); 

      objelementos.pgrprogreso.setVisibility(View.INVISIBLE); 
     //rtlCuerpo.set 






    }else{//SI ES UNA FOTO 

     objelementos.txtTitulo.setText(datossss.getTituloPost()); 
     objelementos.txtAutor.setText(datossss.getAutor()); 
     objelementos.imgfotoVideo.setVisibility(View.VISIBLE); 
     objelementos.btnVerfoto.setVisibility(View.VISIBLE); 


     if (datossss.getImagen()!=null){ 
     Bitmap imagen = datossss.getImagen(); 
     objreCReferencias.RegristrarReferenciaDebilBitmap(imagen, objReferenciaDebilBitmaps); 
     int width = imagen.getWidth(); 
      int height = imagen.getHeight(); 
      int newWidth = activiadPricipal.getWindowManager().getDefaultDisplay().getWidth(); 
      int newHeight = newWidth-80; 

      float scalarw=((float) newWidth) /width; 
      float scalarh=((float) newHeight) /height; 

     Matrix ma = new Matrix(); 
     ma.postScale(scalarw, scalarh); 

     Bitmap res = Bitmap.createBitmap(imagen, 0, 0, 
       width, height, ma, true); 

     objreCReferencias.RegristrarReferenciaDebilBitmap(res, objReferenciaDebilBitmaps);  
     objelementos.imgfotoVideo.setImageBitmap(res); 
     //imagen.recycle(); 
     //res.recycle(); 
     objelementos.btnComentarios.setEnabled(true); 
     objelementos.pgrprogreso.setVisibility(View.INVISIBLE); 
     }else{ 
       int newWidth = activiadPricipal.getWindowManager().getDefaultDisplay().getWidth(); 
       int newHeight = newWidth-80; 

       objelementos.imgfotoVideo.setImageBitmap(null); 
       objelementos.imgfotoVideo.setMinimumHeight(newHeight); 
       objelementos.imgfotoVideo.setMinimumWidth(newWidth); 


      objelementos.btnComentarios.setEnabled(false); 
      objelementos.pgrprogreso.setVisibility(View.VISIBLE); 
     } 
     objelementos.txtPost.setVisibility(View.INVISIBLE); 
     objelementos.btnVerVideo.setVisibility(View.INVISIBLE); 
     objelementos.txtFecha.setText(datossss.getFecha()); 



    } 



    } 

    if (datossss.getImagenAvatar()!=null){ 
     objelementos.imgAvatar.setImageBitmap(datossss.getImagenAvatar()); 
    }else{ 
     objelementos.imgAvatar.setImageResource(R.drawable.avatarpredeterminado); 
    } 


    objelementos.txtTitulo.setText(datossss.getTituloPost()); 



    return vistaFila; 



     } 

objelementos 해당 viewholder

입니다 잘못하고있는거야? 모든 이미지에 대해 약한 참조를 사용하는 적절한 방법은 무엇이며 필요없는 경우 삭제 될 수 있습니까?

답변

1

앱에 bitmaps를 사용하는 경우, (< 안드로이드 4.0에 대한, 이후 4.0에서 비트 맵 DVM의 일부) 비트 맵을 재활용 할 수 안드로이드에 GCbmp.recycle()를 호출하는 것을 잊지 마세요. 또한 같은 문제에 대한 내 대답을 참조하십시오. 나는 많은 해답을 제시해 왔으며, 그것은 분명히 당신의 문제를 해결할 것입니다. bitmap size exceeds Vm budget error android

+0

고마워요, 좋은 도움 –

+0

당신은이 대답을 유용하다고 생각한다면 그것을 높이 평가하는 것을 잊지 마십시오. ;) – Shrikant

+0

내 편집 된 답변을 참조하십시오. – Shrikant

0

어댑터가 효율적이지 않은 것으로 보입니다. api 데모처럼 ViewHolder를 구현 했습니까? 게시물을 편집하여 거기에 붙여 넣을 수 있으므로 문제가 있는지 확인할 수 있습니다.

0

나는 문제가 당신이 다음 항상 OutOfMemoryError가 표시됩니다, 재활용하지 않고 이미지를로드하는 경우, 이미지를로드로 생각합니다. 이미지를 렌더링하기 전에 그래서, 친절 이미지를 축소하기 위해 아래의 코드를 사용하려고 : 이미지 품질을 확장하여 약간 감소 될 것으로

/* 
    * Function used to reduce the size of the image to avoid memory out of 
    * bound exception. 
    */ 
    public static Bitmap decodeFile(String f) { 
     try { 
      // Decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeStream(new FileInputStream(f), null, o); 
      // The new size we want to scale to 
      final int REQUIRED_SIZE = 150; 
      // Find the correct scale value. It should be the power of 2. 
      int scale = 1; 
      while (o.outWidth/scale/2 >= REQUIRED_SIZE 
        && o.outHeight/scale/2 >= REQUIRED_SIZE) 
       scale *= 2; 

      // Decode with inSampleSize 
      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize = scale; 
      return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
     } catch (FileNotFoundException e) { 

     } 
     return null; 
    } 

염두에 두십시오.