更新:2012年12月10日
用图像制作后:
WeakHashMap<Bitmap, WeakReference<Bitmap>> objReferenciaDebilBitmaps;
Bitmap imagen = datossss.getImagen();
objreCReferencias.RegristrarReferenciaDebilBitmap(imagen, objReferenciaDebilBitmaps);我的全班
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);
}每次创建图像后,我都不知道使用弱引用位图的方法是否正确,
但还是给了我一个问题
这是我的逻辑猫
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;
}与之等价的生物
,这就是我做错的地方吗?我可能会说,这是对所有图像使用弱引用的正确方法,并且在不需要?时被删除。
发布于 2012-12-05 08:26:28
如果您在应用程序中使用bitmaps,请不要忘记调用bmp.recycle(),因为安卓中的GC不能回收位图(对于bitmap size exceeds Vm budget error android
发布于 2012-12-05 08:25:18
似乎你的适配器没有效率。您是否像在api中那样实现了ViewHolder?您可以编辑您的帖子并将适配器粘贴到那里,这样我们就可以看到这是否是问题所在。
发布于 2012-12-05 08:35:47
我认为问题在于加载图像,如果您正在加载图像而不进行循环,那么它将始终显示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;
} 请记住,通过缩小图像质量将略有降低。
https://stackoverflow.com/questions/13718944
复制相似问题