Ich habe einen Speicherverlust mit ListActivity in Android
Ich habe eine Anwendung, die einen Dienst und einige Listenaktivitäten verwendet. Wenn die Aktivitäten geöffnet werden, kann ich sehen, dass die Heap-Nutzung in DDMS zunimmt. Wenn die Aktivitäten geschlossen werden, nimmt die Heap-Nutzung leicht ab. Der Dienst wird zu diesem Zeitpunkt noch im Hintergrund ausgeführt. Wenn die Aktivität erneut gestartet wird, indem die Anwendung erneut ausgeführt und geschlossen wird, steigt die Heap-Nutzung erneut an und sinkt dann. Sie wird jedoch nie auf die ursprüngliche Ebene zurückgesetzt, bevor die Aktivität zum ersten Mal geöffnet wurde. Wenn die Aktivität wiederholt (10-15 Mal) geöffnet wird, wird die Aktivität geschlossen, und die Heap-Größe (sowohl MB- als auch # -Objekte) wird angezeigt!
Ich würde erwarten, dass ListActivitys onDestroy für sich selbst sorgt, wenn es zerstört wird. Was fehle ich damit? Verwende ich ListActivity falsch?
Eine Test-App, die meinem tatsächlichen Code ähnelt, finden Sie unten. Erstellen Sie eine neue Android-Anwendung und fügen Sie diese zum Manifest hinzu:
<service android:name="LeakTestService"/>
und diese Java-Dateien:
LeakTestActivity.java ------------- package LeakTest.Test; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.SimpleAdapter; public class LeakActivity extends ListActivity { ArrayList> _Data=new ArrayList>(); ArrayAdapter _Adapter; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent svc = new Intent(this.getApplicationContext(), LeakTestService.class); startService(svc); // the problem happens with both SimpleAdapter and ArrayAdapter //_Adapter = new SimpleAdapter(this.getApplicationContext(), _Data, android.R.layout.two_line_list_item, new String[] { "line1","line2" }, new int[] { android.R.id.text1, android.R.id.text2 }); _Adapter = new ArrayAdapter(this.getApplicationContext(), android.R.layout.simple_list_item_1, new String[] {"data1","data2"} ); // if this line is removed, the heap usage never balloons if you repeatedly open+close it getListView().setAdapter(_Adapter); } @Override public void onDestroy() { _Adapter=null; // this line doesn't help getListView().setAdapter(null); // neither does this line super.onDestroy(); } } LeakTestService.java -------- package LeakTest.Test; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.widget.Toast; public class LeakTestService extends Service { @Override public void onStart(Intent intent, int startId) { Toast.makeText(getBaseContext(), "Service onStart", Toast.LENGTH_SHORT).show(); } @Override public void onDestroy() { Toast.makeText(getBaseContext(), "Service onDestroy", Toast.LENGTH_SHORT).show(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } }