I accidentally posted that last one before I was done.
I have read copious posts on this, but no solution. After using MAT
extensively on a simple ApiDemo list view sample, I am ABSOLUTELY
convinced that the ListView/ListActivity is leaking memory. I say
this because I can see every instance I've created persisting in
memory -- regardless of forcing a garbage collection. To repeat copy
the code below into a project, create another simple Activity and go
back and forth between the two a few times. Then in DDMS force a GC
and dump the heap hprof file. Open the OQL tab in MAT and type the
following query "select * from com.<package name>.TmpTestActivity" and
run... you'll notice multiple instances of TmpTestActivity in memory.
Here's my code:
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class TmpTestActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new MyListAdapter(this));
}
@Override
protected void onDestroy()
{
super.onDestroy();
final MyListAdapter mla =
(MyListAdapter)getListView().getAdapter();
mla.onDestroy();
// here I tried setting the activity's contained ListView's
onItemClickListener to null
// since it references an anonymous non-static inner private
class ... see source for ListActivity
getListView().setOnItemClickListener(null);
}
// Here I made the simple Adapter a static inner class to avoid
implicitly referencing the outer class
private static class MyListAdapter extends BaseAdapter {
// I also created an onDestroy function to release the
reference to the outer class's context
public void onDestroy()
{
mContext = null;
}
public MyListAdapter(Context context) {
mContext = context;
}
public int getCount() {
return mStrings.length;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return !mStrings[position].startsWith("-");
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup
parent) {
TextView tv;
if (convertView == null) {
tv = (TextView) LayoutInflater.from(mContext).inflate(
android.R.layout.simple_expandable_list_item_1, parent, false);
} else {
tv = (TextView) convertView;
}
tv.setText(mStrings[position]);
return tv;
}
private Context mContext;
private String[] mStrings = {
"----------",
"----------",
"Abbaye de Belloc",
"Abbaye du Mont des Cats",
"Abertam",
"----------",
"Abondance",
"----------",
"Ackawi",
"Acorn",
"Adelost",
"Affidelice au Chablis",
"Afuega'l Pitu",
"Airag",
"----------",
"Airedale",
"Aisy Cendre",
"----------",
"Allgauer Emmentaler",
"Alverca",
"Ambert",
"American Cheese",
"Ami du Chambertin",
"----------",
"----------",
"Anejo Enchilado",
"Anneau du Vic-Bilh",
"Anthoriro",
"----------",
"----------"
};
}
}
--
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