Исключение OutOfMemory появляется при прокрутке списка изображений

У меня есть список 70 текстовых объектов со значками изображения (которые хранятся в drawables папке). Если я запускаю приложение в первый раз и медленно прокручиваю список - исключение не происходит.

Когда приложение запущено в первый раз, когда и я прокручиваю список с действием 'броска', следующее исключение происходит:

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)

После этого, если я уничтожаю приложение с DDMS, запустите его снова и прокрутите его с действием 'броска', исключение не происходит. Таким образом, исключение возникает, только если приложение установлено и запустилось в первый раз.

Вот адаптер, который я использую для списка:

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;
}

}

Существует ли способ избежать исключения? Я должен поймать исключение и выйти из памяти так или иначе?

Совет, как выполнить это?

Спасибо.

6
задан Zzokk 15 January 2010 в 09:00
поделиться

1 ответ

Вы не можете поймать java.lang.OutofmemoryError . Они в значительной степени смертельной.

Теперь вы говорите, что проблема возникает только в первый раз, когда вы запускаете свое приложение. Это заставляет меня думать, что проблема не с кодом просмотра. Если пользователь снимает ресурс тяжелый просмотр, он может использовать много памяти, но, как вы говорите, нормально ваша приложение работает нормально.

Итак - какую инициацию вы делаете первый раз, когда вы запускаете свое приложение? Возможен ли один из первых запуска, когда задачи протеивают память, означающее, что не хватает, чтобы использовать ваш вид?

3
ответ дан 17 December 2019 в 18:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: