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
--~--~---------~--~----~------------~-------~--~----~
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