Android, утечка памяти через что? Контекст? Посмотреть список? SDK? - PullRequest
0 голосов
/ 29 апреля 2018

Я все еще новичок в Java и Android.

Недавно я наткнулся на видео на YouTube, в котором предлагалось не использовать «this», когда в качестве параметра задан контекст. (: https://www.youtube.com/watch?v=gz7acZGaXoc&list=PLfuE3hOAeWhYlesGCkCU7xa4_SIfpLCgT&index=4)

И ... все это казалось хорошим и разумным. Но я не совсем уверен.

Я начал изучать курсы Udacity, и они (насколько мне известно) всегда использовали «this» в качестве ключевого слова для получения текущего контекста. Например:

ArrayAdapter<String> itemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, numberList);
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(itemsAdapter);

И это тоже кажется разумным. Поскольку, когда вы занимаетесь какой-либо деятельностью, вам не обязательно понимать контекст приложения.

Как я понимаю, сборщик мусора в Java не уловил бы то, на что ссылается, и когда (с первого youtuber) вы поворачиваете экран - создаете новый экземпляр - новое действие фактически запускается без сбора старого. Ведущий к утечке.

/ getApplicationContext (), вероятно, не будет хорошим выбором для запуска ListView, но для экспериментов и для другого теста ... /

Итак, я начал эксперимент, не поворачивая экран, но ... вместо этого я просто открыл бы / новое действие с помощью явного намерения, возврата, повтора, возврата, повтора и т. Д. Тем временем я бы запустил ADB и посмотрите на использование памяти.

В обоих случаях может показаться, что они немного просачиваются (увеличиваются на 1 МБ после +/- 10 щелчков). Это будет увеличиваться волнообразно: начало (в точке y), открытие (переход к x), назад (переход к y + 1), открытие (переход к x + 1), назад (переход к y + 1 + 1) ) и т. д.

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

Теперь, чтобы проверить немного дальше, я переместил приложение в фоновый режим, нажав home, снова открыв его, вернув в фон и т. Д. ... И здесь тоже перезапуски.

В конце концов у меня возник вопрос: это нормально? Или ... чтобы быть более точным. Почему монитор говорит, что утечка небольшого объема памяти? Это также может быть не утечка в приложении, но в той части контракта, которая была заключена для мониторинга этого? И, если, в случае, если это действительно утечка, почему? Является ли это частью коллектора, и мы должны жить с этим?.

Примечание: мой телефон работает с SDK <25. </p>

Остальной код: Основной:

super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView NumbersList = (TextView) findViewById(numbers);
        NumbersList.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent numbersIntent = new Intent(MainActivity.this, NumbersActivity.class);
                startActivity(numbersIntent);
            }
        });

Остальной код: Активность:

super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_numbers);

1 Ответ

0 голосов
/ 29 апреля 2018

Я наткнулся на видео на YouTube, в котором предлагалось не использовать «this», когда в качестве параметра задан контекст

Надеюсь, это не то, что они сказали, так как это был бы плохой совет.

Как я понимаю, сборщик мусора в Java не уловил бы то, на что ссылается, и когда (с первого youtuber) вы поворачиваете экран - создаете новый экземпляр - новое действие фактически запускается без сбора старого. Ведущий к утечке.

Использование экземпляра Activity для ArrayAdapter не приводит к утечке памяти.

Кажется, что оба случая протекают немного

В обоих случаях потребляет чуть больше памяти. Это не означает утечку. Имейте в виду, что сборщик мусора на Android не особенно агрессивен. Тот факт, что вы поворачиваете экран, не означает, что каждый бит мусора будет собираться немедленно.

Почему монитор говорит, что у него небольшой объем памяти?

Это не так. Это говорит о том, что вы потребляете небольшое количество дополнительной памяти.

Документация охватывает генерацию дампов кучи , что является одним из способов обнаружения утечек. Для обнаружения утечек активности вы также можете интегрировать LeakCanary в свое приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...