У меня есть приложение, которое использует Сервис и некоторые списки действий.Когда действия открыты, я вижу увеличение использования кучи в DDMS, когда действия закрываются, использование кучи немного уменьшается.На данный момент служба все еще работает в фоновом режиме.Если действие снова запускается повторным запуском приложения и закрытием, использование кучи снова увеличивается, затем уменьшается, но никогда не возвращается к исходному уровню до первого открытия действия.Если он многократно (10-15 раз) открывает действие, а затем закрывает действие, размер кучи (как MB, так и # Objects) раздувается!
Я ожидаю, что onDestroy ListActivity позаботится о себе, когда он будет уничтожен,Чего мне не хватает с этим?Я неправильно использую ListActivity?
Ниже представлено тестовое приложение, похожее на мой реальный код.Создайте новое приложение для Android, добавьте его в манифест:
<service android:name="LeakTestService"/>
и эти файлы java:
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;
}
}