Still struggling with this, anyone have any ideas? - Dan
On Sun, Aug 16, 2009 at 12:07 AM, Dan Sherman <impact...@gmail.com> 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) < > balwinder.k...@t-mobile.com> 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 <impact...@gmail.com> 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 >> >> >> > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---