Будет ли создание одноэлементного класса приложения причиной утечки памяти?

Я создал собственный класс приложения для своего приложения. Этот класс onCreate устанавливает статическую переменную для себя следующим образом

public void onCreate() {
  super.onCreate();
  mInstance = this;
}
public static ChattyApp getInstance() {
  return mInstance;
}

Затем я использую метод App.getInstance(), чтобы получить контекст приложения для класса неактивности / фрагмента, такого как API-контроллер или что-то в этом роде. Может ли это вызвать утечку памяти?

Я настраиваю канарейку утечки, и она показывает утечку памяти в переменной экземпляра класса Application. Эта переменная хранит ссылку на сокет socket.io, так что я могу использовать его в любом месте приложения.


person Shahid Helal    schedule 19.06.2019    source источник
comment
Передайте экземпляр с помощью конструктора.   -  person Navin Kumar    schedule 19.06.2019
comment
В AndroidStudio (верхняя строка меню) используйте Analyze - ›InspectCode, он сообщит обо всех возможных утечках памяти вашего приложения и других советах.   -  person Andrea Ebano    schedule 19.06.2019


Ответы (1)


Это хороший вопрос, который вы задали, и люди на SO провели обширные обсуждения по этому поводу. Взгляните на this и это

Хотя это кажется нормальным способом сохранить контекст в классе приложения согласно обсуждению в первой ссылке, могут быть более эффективные способы справиться с этим.

В идеале для каждой логической единицы у вас должен быть отдельный класс, чтобы иметь дело с ней, а не загрязнять ваш класс приложения. Однако ваш класс приложения может initialize или setup эти другие классы. Это создаст разделение проблем.

Другой способ - использовать Dagger2, среду внедрения зависимостей, чтобы внедрить ссылку на ваш сокет, где бы вы ни находились. хотеть.

У Dagger 2 крутая кривая обучения, но он является очень важным инструментом для Android-разработчика.

person kerry    schedule 19.06.2019
comment
Да, кинжал - хороший вариант, и я планирую перейти на него, но сейчас это не оптимально для меня. И кривая обучения займет некоторое время. - person Shahid Helal; 19.06.2019
comment
Тогда вы можете использовать первый метод - person kerry; 19.06.2019
comment
Спасибо, я думаю, исправил. Я отключал все прослушиватели сокетов каждый раз в onDestroy. И заменил метод getInstance на получение контекста и просто приведение контекста к классу Application вместо сохранения статической ссылки. Я не уверен, что однажды решило проблему. - person Shahid Helal; 19.06.2019