Thanks a ton :) I understand completely that this is a horrible use of setContentView(), and I imagined that was what the problem was, however, just wanted to make sure I wasn't losing my marbles here.
Great job with Android so far, keep up the good work :) On Mon, Aug 17, 2009 at 11:14 PM, Romain Guy <romain...@google.com> wrote: > > You are indeed causing a leak in a nasty way. What's going on is the > following: > > - The button is attached to a window > - You press the button > - The button executes the click listener > - In the click listener you setContentView() > - This in turns detaches the button from the window > - The button finishes handling the click and tries to unset its > pressed state by calling View.post(Runnable) > - There's no window, so the Runnable is enqueued in ViewRoot > - The runnable queue is never looked at because the first layout > already happened > > To fix it's simple: > > @Override > public void onClick(View v) { > v.post(new Runnable() { > public void run() { > setMode(); > } > }): > } > > I'll add a "fix" in Eclair for this but really you should consider > what you're doing. Changing the content view is not really how Android > apps usually work, instead you should use a different activity. > > On Mon, Aug 17, 2009 at 6:26 PM, Dan Sherman<impact...@gmail.com> wrote: > > Dump is attached. Shows the application state after about 50 clicks on > the > > button. > > > > Again, sorry for my ineptitude in the dump analysis, just haven't worked > > with them enough. > > > > Looks to be that mActions (ArrayList) is growing with lots of > > android.view.ViewRoot$ > > RunQueue$HandlerAction (which I imagine is a callback that gets setup > with > > the OnClickListener). > > > > The code used to create is as follows: > > > > public class SetContentTest extends Activity implements OnClickListener { > > @Override > > public void onCreate(Bundle savedInstanceState) { > > super.onCreate(savedInstanceState); > > setMode(); > > } > > > > @Override > > public void onClick(View v) { > > setMode(); > > } > > > > public void setMode() { > > setContentView(R.layout.main); > > ((Button) findViewById(R.id.btn_main)).setOnClickListener(this); > > } > > } > > > > Thanks again :) > > > > > > On Mon, Aug 17, 2009 at 9:21 PM, Dan Sherman <impact...@gmail.com> > wrote: > >> > >> Dumps are attached. One pre-leak (start of application), and one after > >> about 50ish clicks on the button, which causes the leak. > >> > >> Again, sorry for my ineptitude in the dump analysis, just haven't worked > >> with them enough. > >> > >> Looks to be that mActions (ArrayList) is growing with lots of > >> android.view.ViewRoot$RunQueue$HandlerAction (which I imagine is a > callback > >> that gets setup with the OnClickListener). > >> > >> The code used to create is as follows: > >> > >> public class SetContentTest extends Activity implements OnClickListener > { > >> @Override > >> public void onCreate(Bundle savedInstanceState) { > >> super.onCreate(savedInstanceState); > >> setMode(); > >> } > >> > >> @Override > >> public void onClick(View v) { > >> setMode(); > >> } > >> > >> public void setMode() { > >> setContentView(R.layout.main); > >> ((Button) findViewById(R.id.btn_main)).setOnClickListener(this); > >> } > >> } > >> > >> Thanks guys :) > >> > >> > >> On Mon, Aug 17, 2009 at 2:11 PM, Romain Guy <romain...@google.com> > wrote: > >>> > >>> Please do. > >>> > >>> On Mon, Aug 17, 2009 at 10:45 AM, Dan Sherman<impact...@gmail.com> > wrote: > >>> > I'll check it out tonight when I get access to the dump again. But > >>> > from > >>> > what I remember, it was just a really long list of nested Runnables > >>> > (I'm > >>> > sure I missed something). > >>> > > >>> > Would it help if I posted the dump? > >>> > > >>> > - Dan > >>> > > >>> > On Mon, Aug 17, 2009 at 1:39 PM, Dianne Hackborn < > hack...@android.com> > >>> > wrote: > >>> >> > >>> >> On Mon, Aug 17, 2009 at 9:57 AM, Dan Sherman <impact...@gmail.com> > >>> >> wrote: > >>> >>> > >>> >>> Looks to be a Runnable (from what I can tell). > >>> >> > >>> >> It can't just be a Runnable, it needs to be a concrete > implementation > >>> >> of > >>> >> Runnable. I am pretty sure hat will show you the actual class > >>> >> implementation, since it only deals in concrete classes. This may > be > >>> >> an > >>> >> (anonymous) inner class, in which case there should be fields in it > >>> >> you can > >>> >> follow to get back to a more interesting class. > >>> >> > >>> >> -- > >>> >> Dianne Hackborn > >>> >> Android framework engineer > >>> >> hack...@android.com > >>> >> > >>> >> Note: please don't send private questions to me, as I don't have > time > >>> >> to > >>> >> provide private support, and so won't reply to such e-mails. 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 > >>> > >>> > >> > > > > > > > > > > > > > -- > 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 -~----------~----~----~----~------~----~------~--~---