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