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