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