Thanks for the reply!  Originally we only had the ImageView icon and
TextView guts.  The only reason we added the BitmapDrawable and Bitmap
was because we wanted to maintain direct references that we could
null.  Even without those two in our ViewHolder, the same problem
still exists.

Thing that is perplexing is that we do not have any problems with the
heap space, yet the load time from quitting the activity that is above
our list and showing the list is definitely directly proportional to
how many calls there have been to getView().
-Sam

On May 6, 4:18 pm, Romain Guy <[email protected]> wrote:
> Why are you putting the Bitmap inside the ViewHolder? That means you
> are always loading the bitmaps, which is very slow. You could simply
> use a list of SoftReference<Bitmap> to store them.
>
>
>
> On Wed, May 6, 2009 at 1:11 PM, sam <[email protected]> wrote:
>
> > Hey guys, I am writing an app that has an activity that is a
> > ListActivity which implements its own listadapter.  Each row is
> > defined by an xml layout, and the contents of each row is an ImageView
> > (initially bytes stored in our own database and reconstructed into an
> > image on getView()) and a TextView (whose text is contact name from
> > the contact provider database).  We are also allowing the user to
> > launch other activities from our ListActivity by long clicking on a
> > row and selecting from the context menu "view contact", which will
> > launch Intent.ACTION_VIEW, which is the activity that displays all of
> > the information about the relevant contact.
>
> > So it seems like we have a problem that gets compounded every time a
> > call to getView() is made.  Basically, when we first start up the list
> > view, we can start the intent to view a gestures information and
> > subsequently hit the back button to finish the viewing activity and
> > return back to our list activity without any real problems.  But, the
> > more you scroll through the list, and the more you view contact
> > information and come back to the list (inducing more calls to getView
> > ()), the longer the phone takes to return back to our ListActivity,
> > eventually prompting the "not responding" screen.  The problem almost
> > certainly has no relevance to the activity that is launched from our
> > list activity because we have tried opening up random apps rather than
> > Intent.ACTION_VIEW and returning to our list view and it resulted in
> > the same behavior.  What does seem to be relevant is having the list
> > activity lose focus and then try to regain it. I have suspicions that
> > we are leaking drawables when calling getView and trying to recycle,
> > but it doesn't make all that much sense because I have spent minutes
> > just scrolling the list with no memory issues.  We have tried testing
> > how much time it took for our program to execute the relevant
> > functions that are a part of every application's life-cycle (onPause,
> > onResume, onStop, onRestart, onStart), to see if there is any
> > significant slow down in any of those calls, but they are all very
> > fast.  The only correlation we have witnessed is the more calls to
> > getView(), the worse the time gets between finishing the activity on
> > top of our list activity and putting our list activity back into
> > focus. We have been stumped for the past few days, our only recourse
> > up until now has been to try to explicitly null the references to
> > everything that gets recycled to encourage garbage collection, but
> > quite honestly I am out of ideas for why this could be happening.
> > Here is our code for getView():
>
> > @Override
> >                        public View getView(int position, View convertView, 
> > ViewGroup
> > parent) {
>
> >                                ViewHolder holder;
> >                                if (convertView == null) {
> >                                        convertView = 
> > mInflater.inflate(R.layout.list_view, null); /*our
> > view holding a tview and iview*/
>
> >                                        // Creates a ViewHolder and store 
> > references to the two children
> > views
> >                                        // we want to bind data to.
> >                                        holder = new ViewHolder();
> >                                        holder.guts = (TextView) 
> > convertView.findViewById(R.id.text);
> >                                        holder.icon = (ImageView) 
> > convertView.findViewById(R.id.icon);
> >                                        holder.icon.setImageBitmap(null);
> >                                        // init this stuff
> >                                        holder.bitmapD = null;
> >                                        holder.bitmap = null;
>
> >                                        convertView.setTag(holder);
> >                                } else {
> >                                        // Get the ViewHolder back to get 
> > fast access to the TextView
> >                                        // and the ImageView.
> >                                        holder = (ViewHolder) 
> > convertView.getTag();
> >                                        holder.icon.setImageBitmap(null);
> >                                }
>
> >                                // null the old stuff;
>
> >                                holder.bitmapD = null;
>
> >                                if(holder.bitmap != null) {
> >                                        holder.bitmap.recycle();
> >                                        holder.bitmap = null;
> >                                }
>
> >                                Cursor c1 = (Cursor) getItem(position);
> >                                
> > ContactsListActivity.this.startManagingCursor(c1);
> >                                String name = 
> > c1.getString(c1.getColumnIndexOrThrow(People.NAME));
>
> >                                long personID = 
> > c1.getLong(c1.getColumnIndexOrThrow(People._ID));
> >                                Uri temp = Uri.withAppendedPath
> > (ContactGesturesProvider.GESTURES_CONTENT_URI, "contacts");
> >                                final Uri personURI = 
> > Uri.withAppendedPath(temp, "" + personID);
> >                                Cursor c = mContext.managedQuery(personURI, 
> > null, null, null,
> > null);
>
> >                                BitmapDrawable bd = null;// = new 
> > BitmapDrawable();
> >                                if(c.moveToFirst()) {
> >                                        byte[] work = 
> > c.getBlob(c.getColumnIndexOrThrow
> > (ImageProvider.IMAGE_COLUMN));
> >                                        Bitmap newb = 
> > BitmapFactory.decodeByteArray(work, 0,
> > work.length);
> >                                        bd = new BitmapDrawable(newb);
>
> >                                        holder.bitmap = newb;
> >                                }
> >                                c.close();
> >                                // Bind the data efficiently with the holder.
> >                                holder.guts.setText(name);
> >                                holder.icon.setImageDrawable(bd);
> >                                holder.bitmapD = bd;
>
> >                                return convertView;
> >                        }
>
> > and our holder:
>
> > // stuff for views
> >        private static class ViewHolder {
> >                ImageView icon;
> >                TextView guts;
> >                BitmapDrawable bitmapD;
> >                Bitmap bitmap;
> >        }
>
> > Thanks ahead of time for anyone who has made it this far, let alone
> > for posting a reply!
>
> > -Sam
>
> --
> Romain Guy
> Android framework engineer
> [email protected]
>
> Note: please don't send private questions to me, as I don't have time
> to provide private support.  All such questions should be posted on
> public forums, where I and others can see and answer them
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to