Hey, thanks for that reply.  I just changed the code so that the xml
no longer has the imageview and uses compound drawable intrinsic
etc..., but the same problem still exists.

-Sam

On May 6, 4:37 pm, Romain Guy <romain...@google.com> wrote:
> BTW, instead of using imageview + textview, you should use the
> compound drawable feature of textview. That will save you one view per
> row.
>
>
>
> On Wed, May 6, 2009 at 1:35 PM, sam <samuel.e.pe...@gmail.com> wrote:
>
> > 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 <romain...@google.com> 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 <samuel.e.pe...@gmail.com> 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
> >> romain...@android.com
>
> >> 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
>
> --
> Romain Guy
> Android framework engineer
> romain...@android.com
>
> 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 android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to