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

Reply via email to