У меня утечка памяти при использовании ListActivity в Android - PullRequest
4 голосов
/ 12 октября 2010

У меня есть приложение, которое использует Сервис и некоторые списки действий.Когда действия открыты, я вижу увеличение использования кучи в 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;
    }
}

Ответы [ 2 ]

9 голосов
/ 30 июня 2011

У меня была та же проблема, но я обнаружил, что проблема возникла только во время отладки.При «нормальном» запуске все действия исчезли.

4 голосов
/ 12 октября 2010

Если несколько раз (10-15 раз) открыть действие, затем закрыть действие, всплывающие подсказки размера кучи (как МБ, так и # объектов)!

Запустили ли вы сборщик мусора?В DDMS есть кнопка для этого.

После того, как вы запустите сборщик мусора и, похоже, не получите ничего для сбора (как зарегистрировано в LogCat), вы всегда можете сбросить кучу и проверить ее с помощью MAT или jhat .

Не правильно ли я использую ListActivity?

Удалить все вхождения getApplicationContext() в вашей деятельности изамените их на this.Действие - это a Context, и вы хотите использовать Activity в этих местах.

Точно так же я не знаю, почему вы звоните getBaseContext() вService, а не просто this, поскольку Service тоже Context.

...