Тестирование на утечки памяти в приложениях Android - PullRequest
6 голосов
/ 09 декабря 2011

Недавно я узнал, сколько памяти можно потратить из-за утечки контекста и как проверить наличие таких утечек с помощью дампа памяти после изменения ориентации экрана. Новое действие должно быть создано и создано, оригинальное уничтожено и собрано. Однако, если у меня нет утечки памяти и я не вижу ее, то приведенное ниже действие, похоже, не собирается, если оно запускает другое действие и разрушает себя:

public class Foo extends Activity {
    private Button button;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        button = new Button(this);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                startActivity(new Intent(Foo.this, Bar.class));
                finish();
            }
        });

        setContentView(button);
    }

    protected void onDestroy() {
        super.onDestroy();

        button.setOnClickListener(null);

        Log.e("you're it", "isFinishing() == " + isFinishing());
    }
}

public class Bar extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView textView = new TextView(this);
        textView.setText("hello, world");

        setContentView(textView);
    }
}

Вот информация о дампе памяти, взятая после нажатия кнопки, чтобы запустить панель и несколько раз запросить сборку мусора:

Class Name                                               | Shallow Heap | Retained Heap
----------------------------------------------------------------------------------------
com.test.testProject.Foo @ 0x4135b188                    |          184 |         2,208
 mOuterContext android.app.ContextImpl @ 0x4135b390      |           96 |           392
  <Java Local> java.lang.Thread @ 0x40996460  main Thread|           80 |         1,416
  mContext android.media.AudioManager @ 0x4135b480       |           48 |           176
----------------------------------------------------------------------------------------

Исходя из этого , я подумал, что дополнительный финиш между действиями сделает первый из них подходящим для сбора и позволит мне дополнительно проверить наличие утечек, это разумно? Я теряю память? Есть ли какая-то причина, по которой Android захочет сохранить эту разрушенную активность?

1 Ответ

0 голосов
/ 08 апреля 2013

может быть, вы можете попробовать код, как показано ниже:

 button.setOnClickListener(new OnClickListener() {
        public void onClick(View view) {
            startActivity(new Intent(getApplicationContext(), Bar.class));
            finish();
        }
    });
...