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