Мое простое приложение ListView пропускает память. Что я делаю не так? - PullRequest
2 голосов
/ 18 ноября 2010

Во-первых, я сначала опубликовал это в группе Google Android, но она модерировалась, и я не уверен, сколько времени потребуется, чтобы появиться там, поэтому надеюсь, что кто-то здесь может помочь.

Я создал простое приложение с ListView, следующим за ListActivity. примеры, которые я нашел в сети.

В приложении есть 2 действия, первое из которых имеет кнопку для создания второй. Когда я нажал кнопку закрытия на втором занятии, я бы как это, чтобы освободить свою память (или, по крайней мере, позволить ему быть мусором собраны). В настоящее время он никогда не выйдет.

Я, должно быть, делаю что-то не так, потому что MyListActivity никогда получает освобождение. Может кто-нибудь сказать мне, если я делаю что-то не так с как мои действия создаются / уничтожаются? или если мое использование ListView не так?

Спасибо.

Мое приложение в виде почтового индекса - http://www.mediafire.com/?l26o5hz2bmbwk6j

Снимок экрана Eclipse MAT, показывающий, что список активности никогда не выпускается память - www.mediafire.com/?qr6ga0k

public class MyListActivity extends ListActivity {  
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listlayout);        
    ListAdapter ada = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, GENRES);               
    setListAdapter(ada);    
}

@Override
public void onDestroy()
{                   
    super.onDestroy();
    System.gc();
}

public void ClickHandler(View target)
{
    switch (target.getId())
    {
        case R.id.LL_Btn1:
            finish();
            break;
    }
}   

private static final String[] GENRES = new String[] {
    "Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama",
    "Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller"
};} 

public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

public void ClickHandler(View target)
{
    switch (target.getId())
    {
        case R.id.M_Button01:
            Intent intent = new Intent();
            intent.setClassName(MyListActivity.class.getPackage().getName(), MyListActivity.class.getName());         
            startActivity(intent);  
            break;
    }
}}

Ответы [ 3 ]

0 голосов
/ 02 августа 2011

Не уверен, поможет ли это, и это обычно не рекомендуется делать, но следующее убьет ваш процесс в onDestroy ():

System.runFinalizersOnExit (истина); android.os.Process.killProcess (android.os.Process.myPid ());

Поместите это в метод onDestroy. Теперь это может фактически убить ваш основной процесс, если он вызван дочерним действием (не проверял его).

ВНИМАНИЕ: я обычно не рекомендую делать это как "хакерский" способ сделать это, но если вам просто нужно закрыть приложение (или действие) после выхода, тогда это будет работать. Вам все еще нужно отладить, чтобы узнать, почему ваше приложение остается открытым и потребляет память.

0 голосов
/ 11 февраля 2016

Eclipse MAT был причиной. Новая Android Studio не вызывает этих проблем.

0 голосов
/ 19 ноября 2010

Вы пытались избавиться от System.gc () и посмотреть, что происходит? Вызов System.gc () означает, что виртуальная машина просто инициирует сборку мусора - нет гарантии, когда это будет сделано.

...