Tengo una lista de 70 elementos de texto con iconos de imagen (que se almacenan en la carpeta de dibujos). Si abro la aplicación por primera vez y desplazo la lista lentamente, la excepción no ocurre.Excepción de OutOfMemory aparece mientras se desplaza por la lista de imágenes
Cuando se inicia la aplicación por primera vez y me desplazarse por la lista con la acción 'aventura' produce la excepción siguiente:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:439)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:322)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:688)
at android.content.res.Resources.loadDrawable(Resources.java:1710)
at android.content.res.Resources.getDrawable(Resources.java:585)
Después de eso, si mato a la aplicación con DDMS, empezar de nuevo y de desplazamiento con la acción 'fling', la excepción no ocurre. Entonces, la excepción surge solo si la aplicación se instala y se inicia por primera vez.
Aquí es el adaptador que uso para la lista:
public class AuthorAdapter extends ArrayAdapter<Author> {
private ArrayList<Author> items;
private Context context;
private LayoutInflater inflater;
public AuthorAdapter(Context context, int textViewResourceId, ArrayList<Author> items) {
super(context, textViewResourceId, items);
this.items = items;
this.context = context;
inflater = LayoutInflater.from(this.context);
}
static class ViewHolder {
ImageView authorFace;
TextView authorName;
TextView authorWho;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.autor_data, null);
holder = new ViewHolder();
holder.authorFace = (ImageView) convertView.findViewById(R.id.authorFaceImageView);
holder.authorName = (TextView) convertView.findViewById(R.id.authorNameTextView);
holder.authorWho = (TextView) convertView.findViewById(R.id.authorWhoTextView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Author author = items.get(position);
if (author != null) {
if (holder.authorFace != null) {
String faceFileName = author.getFace();
String facePlaceName = context.getPackageName() + ":drawable/" + faceFileName.subSequence(0, faceFileName.lastIndexOf("."));
int faceFileId = context.getResources().getIdentifier(facePlaceName, null, null);
holder.authorFace.setImageResource(faceFileId);
}
if (holder.authorName != null) {
holder.authorName.setText(author.getName());
}
if (holder.authorWho != null) {
holder.authorWho.setText(author.getWho());
}
}
return convertView;
}
}
¿Hay una manera de evitar la excepción? ¿Debo atrapar la excepción y escapar de la memoria de alguna manera?
¿Algún consejo sobre cómo lograr esto?
Gracias.
¿Qué tan grandes son sus imágenes? –
Las imágenes de los elementos de la lista son de aproximadamente 3 KB cada una. Uso dos actividades (principal y lista). Las imágenes de fondo de la actividad son de aproximadamente 60 KB cada una. También hay imágenes que uso para controles de UI, alrededor de 100 KB en total. ¿Puede ser un problema de simulador? Lamentablemente, no puedo probar mi aplicación en el dispositivo en este momento. – Zzokk