What is the type of the object in the array that is increasing in number?

On Mon, Aug 17, 2009 at 9:36 AM, Dan Sherman <[email protected]> wrote:

> Still struggling with this, anyone have any ideas?
>
> - Dan
>
>
> On Sun, Aug 16, 2009 at 12:07 AM, Dan Sherman <[email protected]> wrote:
>
>> After some more testing, it doesn't look like it has anything to do with
>> creating a new OnClickListener each time.  The following snippet (using the
>> same Layouts), produces the same leak.
>>
>> Its significantly shorter, and when looking at a heap dump, from what I
>> can tell, an array called mActions in ViewRoot is filling with Runnables
>> (presumably these callbacks), but I'm no expert (and have very little
>> experience in heap dump analysis).
>>
>> 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);
>>     }
>> }
>>
>> Anyone have any ideas?
>>
>> - Dan
>>
>>
>> On Sat, Aug 15, 2009 at 11:56 PM, Balwinder Kaur (T-Mobile USA) <
>> [email protected]> wrote:
>>
>>>
>>> I'm curious too, but seriously you should go with the other options
>>> you mentioned. Creating new onClickListeners with each click is NOT a
>>> good idea !
>>>
>>> Balwinder Kaur
>>> Open Source Development Center
>>> ·T· · ·Mobile· stick together
>>>
>>> The views, opinions and statements in this email are those of the
>>> author solely in their individual capacity, and do not necessarily
>>> represent those of T-Mobile USA, Inc.
>>>
>>> On Aug 15, 7:25 pm, Dan Sherman <[email protected]> wrote:
>>> > Hey guys,
>>> >
>>> > Was curious if anyone could point our a way to avoid the following
>>> memory
>>> > leak.
>>> >
>>> > When switching layouts in a single activity, and assigning
>>> OnClickListeners
>>> > to buttons, each assignment looks to leak a bit of memory.
>>> >
>>> > Below is a quick example application that shows it happening with two
>>> > Button's and a simple function to switch which layout is currently
>>> active.
>>> > If run, you'll see the used memory jump slightly with each click
>>> between
>>> > them.
>>> >
>>> > I'm aware there's plenty of ways around it (using multiple activities
>>> for
>>> > each layout, using a single OnClickListener thats a member variable
>>> which
>>> > gets assigned to it each time), just curious as to where that extra
>>> > reference is going thats not getting collected.
>>> >
>>> > public class SetContentTest extends Activity {
>>> >     @Override
>>> >     public void onCreate(Bundle savedInstanceState) {
>>> >         super.onCreate(savedInstanceState);
>>> >         setContentView(R.layout.main);
>>> >         Button btn = (Button) findViewById(R.id.btn_main);
>>> >         btn.setOnClickListener(new OnClickListener() {
>>> >             @Override
>>> >             public void onClick(View v) {
>>> >                 setMode(false);
>>> >             }
>>> >         });
>>> >     }
>>> >
>>> >     public void setMode(boolean main) {
>>> >         if (main) {
>>> >             setContentView(R.layout.main);
>>> >             Button btn = (Button) findViewById(R.id.btn_main);
>>> >             btn.setOnClickListener(new OnClickListener() {
>>> >                 @Override
>>> >                 public void onClick(View v) {
>>> >                     setMode(false);
>>> >                 }
>>> >             });
>>> >         } else {
>>> >             setContentView(R.layout.other);
>>> >             Button btn = (Button) findViewById(R.id.btn_other);
>>> >             btn.setOnClickListener(new OnClickListener() {
>>> >                 @Override
>>> >                 public void onClick(View v) {
>>> >                     setMode(true);
>>> >                 }
>>> >             });
>>> >         }
>>> >     }
>>> >
>>> > }
>>> >
>>> > And the layouts:
>>> > <?xml version="1.0" encoding="utf-8"?>
>>> > <LinearLayout xmlns:android="
>>> http://schemas.android.com/apk/res/android";
>>> >     android:orientation="vertical"
>>> >     android:layout_width="fill_parent"
>>> >     android:layout_height="fill_parent"
>>> >     >
>>> >
>>> >     <Button
>>> >         android:id="@+id/btn_main"
>>> >         android:layout_width="wrap_content"
>>> >         android:layout_height="wrap_content"
>>> >         android:text="Click for Other"
>>> >         />
>>> > </LinearLayout>
>>> >
>>> > ------------------
>>> >
>>> > <?xml version="1.0" encoding="utf-8"?>
>>> > <LinearLayout xmlns:android="
>>> http://schemas.android.com/apk/res/android";
>>> >     android:orientation="vertical"
>>> >     android:layout_width="fill_parent"
>>> >     android:layout_height="fill_parent"
>>> >     >
>>> >
>>> > <Button
>>> >         android:id="@+id/btn_other"
>>> >         android:layout_width="wrap_content"
>>> >         android:layout_height="wrap_content"
>>> >         android:text="Click for Main"
>>> >         />
>>> > </LinearLayout>
>>> >
>>> > Only difference between the layouts is the name (btn_main and
>>> btn_other)
>>> >
>>> > - Dan
>>>
>>>
>>
>
> >
>


-- 
Dianne Hackborn
Android framework engineer
[email protected]

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.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to