首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存溢出android

内存溢出android
EN

Stack Overflow用户
提问于 2012-12-05 08:22:05
回答 3查看 356关注 0票数 0

更新:2012年12月10日

用图像制作后:

代码语言:javascript
复制
 WeakHashMap<Bitmap, WeakReference<Bitmap>> objReferenciaDebilBitmaps;
 Bitmap imagen = datossss.getImagen();
 objreCReferencias.RegristrarReferenciaDebilBitmap(imagen, objReferenciaDebilBitmaps);

我的全班

代码语言:javascript
复制
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);

}

每次创建图像后,我都不知道使用弱引用位图的方法是否正确,

但还是给了我一个问题

这是我的逻辑猫

代码语言:javascript
复制
  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)

这是我的适配器线

代码语言:javascript
复制
    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;



      }

与之等价的生物

,这就是我做错的地方吗?我可能会说,这是对所有图像使用弱引用的正确方法,并且在不需要?时被删除。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-05 08:26:28

如果您在应用程序中使用bitmaps,请不要忘记调用bmp.recycle(),因为安卓中的GC不能回收位图(对于bitmap size exceeds Vm budget error android

票数 1
EN

Stack Overflow用户

发布于 2012-12-05 08:25:18

似乎你的适配器没有效率。您是否像在api中那样实现了ViewHolder?您可以编辑您的帖子并将适配器粘贴到那里,这样我们就可以看到这是否是问题所在。

票数 0
EN

Stack Overflow用户

发布于 2012-12-05 08:35:47

我认为问题在于加载图像,如果您正在加载图像而不进行循环,那么它将始终显示OutOfMemoryError。因此,在呈现图像之前,请尝试使用以下代码缩小图像:

代码语言:javascript
复制
    /*
     * 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;
    } 

请记住,通过缩小图像质量将略有降低。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13718944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档