2010-01-15 15 views
5

Görüntü simgelerine sahip 70 metin öğesi (çizim klasöründe saklanan) bir listeye sahibim. Uygulamayı ilk kez başlatırsam ve listeyi yavaşça kaydırırsam, istisna gerçekleşmez. Bundan sonraOutOfMemory istisnası görüntülerin listesi kaydırılırken görüntülenir.

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) 

, ben DDMS ile uygulamayı öldürürseniz, tekrar ve kaydırma başlatın: Uygulama ilk kez başlatıldığında ve aşağıdaki durum oluşur 'kaçamak' eylem ile listeyi kaydırın

'fling' eylemiyle istisna gerçekleşmez. Bu nedenle istisna, yalnızca uygulama ilk kurulduğunda ve başlatıldığında ortaya çıkar.

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

}

istisna önlemenin bir yolu var mı: İşte

Ben liste için kullanmak adaptör nedir? İstisnaı yakalamalı mıyım ve bir şekilde hafızadan mı kaçmalıyım?

Bunu nasıl gerçekleştireceğiniz konusunda herhangi bir öneriniz var mı?

Teşekkürler.

+0

Görüntülerin ne kadar büyüğü vardır –

+0

Liste öğesi yaklaşık 3KB'dir. İki aktiviteyi (ana ve liste) kullanıyorum. Etkinlik arka plan görüntüleri, her biri yaklaşık 60KB'dir. Ayrıca, UI denetimleri için kullandığım görüntüler, toplamda yaklaşık 100 KB. Bir simülatör problemi olabilir mi? Maalesef, uygulamamı şu anda cihazımda deneyemiyorum. – Zzokk

cevap

3

java.lang.OutOfMemoryError'u yakalayamazsınız. Onlar çok ölümcül.

Şimdi, sorunun yalnızca uygulamanızı ilk kez çalıştırdığınızda gerçekleştiğini söylüyorsunuz. Bu, bana sorununun görünüm koduyla olmadığını düşünmemi sağlıyor. Bir kullanıcı bir kaynak ağır görüntüsünü çektiyse, çok fazla bellek kullanabilir, ancak söylediğin gibi, normalde uygulamanız iyi çalışır.

Peki - uygulamanızı ilk kez çalıştırdığınızda hangi başlatma işlemini yapıyorsunuz? İlk kez çalıştırılan görevlerden birinin belleğini sızdırması mümkün mü, görüşünüzü kullanmak için yeterli bir şey kalmadı mı?

+0

Aslında, uygulamayı ilk başlattığımda hiçbir resmi başlatmıyorum. Tüm resimlerim çizim klasöründe saklanır. Sadece listenin adaptörünü ayarlıyorum. Bağdaştırıcının getView() yönteminde her liste öğesi için resmi ayarladım (yukarıdaki koda bakın): holder.authorFace.setImageResource (faceFileId); Anladığım kadarıyla, getView() yöntemi her seferinde telefon ekranında bir liste öğesi görüntülenir. Muhtemelen listeyi hızlıca kaydırdığımda, önbellek geri dönüşüme sahip değildir. Listeyi yavaşça kaydırdığımda özel bir durum gözlenmez. – Zzokk

+2

Bellek sızdıran başka bir başlatma davranışı olup olmadığını merak ettim, böylece View'unuzu hızlı bir şekilde kaydırdığınızda Yığınlarda çok fazla görüntü yok. Bu, sorunun neden sadece uygulamanızı ilk kez çalıştırdığınızı açıklar. –

+1

Dave ile katılıyorum, uygulamayı normal başlatmaya başladığınızda ilk kez ne yaptığınıza bakmaya başladım. Uygulamanın ilk başlangıcında büyük bir şeye tutuyorsunuz. –

İlgili konular