У меня есть список 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;
}
}
Существует ли способ избежать исключения? Я должен поймать исключение и выйти из памяти так или иначе?
Совет, как выполнить это?
Спасибо.
Вы не можете поймать java.lang.OutofmemoryError
. Они в значительной степени смертельной.
Теперь вы говорите, что проблема возникает только в первый раз, когда вы запускаете свое приложение. Это заставляет меня думать, что проблема не с кодом просмотра. Если пользователь снимает ресурс тяжелый просмотр, он может использовать много памяти, но, как вы говорите, нормально ваша приложение работает нормально.
Итак - какую инициацию вы делаете первый раз, когда вы запускаете свое приложение? Возможен ли один из первых запуска, когда задачи протеивают память, означающее, что не хватает, чтобы использовать ваш вид?