Move your ListAdapter to a public class or a static inner class of
your Activity, and see if that helps. A ListView being its own adapter
is not a well-trod path.

On Thu, Oct 21, 2010 at 8:04 PM, John Gaby <jg...@gabysoft.com> wrote:
> I am still struggling with a memory leak associated with a ListView.
> I have created the following small program which exhibits this
> behavior.
>
> What I do is create 2 LinearLayouts.  The first has a Button and a
> GListView control.  The code for GListView is below, but it just sub-
> classes ListView, and implements the ListAdapter interface.  When the
> GListView is created, it sets it's adapter to itself.
>
> Now when you press the button I switch to the second LinearLayout.
> This layout has only a single button.  When you press this button, I
> create a new 1st layout with a new GListView and set it as the active
> view.
>
> Run the program, and switch between the two views 20 times.  Then
> bring up the DDMS and force a garbage collection.  Then Dump the heap,
> and use the Memory Analyzer and you will find 21 GListView objects
> remaining.  That is, the 20 GListViews that are not longer connected
> to anything have NOT been freed.
>
> Now if I comment out the 'setAdapter(this)' function in the GListView
> constructor and repeat the above, I find that there is only 1
> GListView that remains.  That is, in this case, all of the unused
> GListViews have been properly recycled.
>
> Someone suggested that I create a private class within my GListView to
> handle the ListAdapter interface, and I tried that, but it did not
> help.
>
> Surely there is some way to make these objects go away when they are
> no longer used anywhere.  (Isn't that what garbage collection is all
> about?)
>
> Any help would be appreciated.  I am really pulling my hair out on
> this one.
>
> Thanks.
>
>
> /*
>  * Activity
>  */
>
> package com.gabysoft.memoryleak;
>
> import android.app.Activity;
> import android.os.Bundle;
> import android.view.View;
> import android.widget.Button;
> import android.widget.LinearLayout;
> import android.widget.ListView;
>
> public class MemoryLeak extends Activity implements
> android.view.View.OnClickListener
> {
>    LinearLayout ll2;
>    boolean page2 = false;
>
>    private LinearLayout CreateLayout()
>    {
>        LinearLayout ll = new LinearLayout(this);
>
>        Button btn1 = new Button(this);
>        ListView    lv    = new GListView(this);
>
>        btn1.setText("Press");
>        btn1.setLayoutParams(new LinearLayout.LayoutParams(100, 40));
>        btn1.setOnClickListener(this);
>
>        ll.addView(btn1);
>        ll.addView(lv);
>
>        return(ll);
>    }
>
>    /** Called when the activity is first created. */
>   �...@override
>    public void onCreate(Bundle savedInstanceState)
>    {
>        super.onCreate(savedInstanceState);
>
>        CreateLayout();
>
>        LinearLayout ll = CreateLayout();
>        ll2 = new LinearLayout(this);
>
>        Button btn2 = new Button(this);
>
>        btn2.setText("Back");
>        btn2.setLayoutParams(new LinearLayout.LayoutParams(100, 40));
>        btn2.setOnClickListener(this);
>
>        ll2.addView(btn2);
>
>        setContentView(ll);
>    }
>
>   �...@override
>    public void onClick(View v)
>    {
>        if (page2)
>        {
>            LinearLayout ll = CreateLayout();
>
>            setContentView(ll);
>
>            page2 = false;
>        }
>        else
>        {
>            setContentView(ll2);
>            page2 = true;
>        }
>    }
>
> }
>
> /*
>  * GListView
>  */
> package com.gabysoft.memoryleak;
>
> import android.content.Context;
> import android.database.DataSetObserver;
> import android.view.View;
> import android.view.ViewGroup;
> import android.widget.AdapterView;
> import android.widget.ListAdapter;
> import android.widget.ListView;
> import android.widget.TextView;
>
> public class GListView extends ListView implements ListAdapter
> {
>    Context m_context;
>    DataSetObserver m_observer = null;
>
>    public GListView(Context context)
>    {
>        super(context);
>
>        m_context    = context;
>
>        setAdapter(this);
>
>        setChoiceMode(CHOICE_MODE_SINGLE);
>    }
>
>    /*
>     * ListAdapter
>     */
>
>
>   �...@override
>    public boolean areAllItemsEnabled()
>    {
>        return true;
>    }
>
>   �...@override
>    public boolean isEnabled(int position)
>    {
>        return true;
>    }
>
>   �...@override
>    public int getCount()
>    {
>        return(0);
>    }
>
>   �...@override
>    public Object getItem(int position)
>    {
>        return null;
>    }
>
>   �...@override
>    public long getItemId(int position)
>    {
>        return(position);
>    }
>
>   �...@override
>    public int getItemViewType(int position)
>    {
>        return 0;
>    }
>
>   �...@override
>    public View getView(int position, View convertView, ViewGroup
> parent)
>    {
>        TextView tv = new TextView(m_context);
>
>        tv.setText("Item");
>
>        return(tv);
>    }
>
>   �...@override
>    public int getViewTypeCount()
>    {
>        return 1;
>    }
>
>   �...@override
>    public boolean hasStableIds()
>    {
>        return false;
>    }
>
>   �...@override
>    public boolean isEmpty()
>    {
>        return false;
>    }
>
>   �...@override
>    public void registerDataSetObserver(DataSetObserver observer)
>    {
>        m_observer    = observer;
>    }
>
>   �...@override
>    public void unregisterDataSetObserver(DataSetObserver observer)
>    {
>        m_observer    = null;
>    }
> }
>
> --
> 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
>



-- 
Mark Murphy (a Commons Guy)
http://commonsware.com | http://github.com/commonsguy
http://commonsware.com/blog | http://twitter.com/commonsguy

Android App Developer Books: http://commonsware.com/books

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