Android: синглтон ссылается на активность, утечка памяти? - PullRequest
1 голос
/ 08 апреля 2020

Прежде всего я хотел бы сказать, извините, если мой вопрос пустышка, я только начинаю с Android. В Интернете я нашел статью, в которой говорится, что синглтон, ссылающийся на активность, вызывает утечку памяти. Я не могу понять, как это происходит! Представьте себе такую ​​ситуацию - у нас есть интерфейс с именем MyInterface, есть синглтон с именем MySingleton и действие, которое реализует MyInterface

interface MyInterface {
   void foo();
}

class MySingleton {
  static MySingleton shared;
  MyInterface delegate;
  private MySingleton() {};

  MySingleton getShared() {
   if(shared == null)
     shared = MySingleton();
   return shared
  }

  void setDelegate(MyInterface delegate) {
   this.delegate = delegate;
  }

class MyActivity extends AppCompatActivity implements MyInterface {

 @Override
 void foo() {//do something}

 @Override
 void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     MySingleton.getShared().setDelegate(this);
     // do other setup
 }    

, поскольку Java не имеет циклический c ссылка не должно быть проблем с сборкой мусора MyActivity, или я ошибаюсь? Еще раз спасибо, если вопрос пустышка и спасибо

Ответы [ 2 ]

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

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

В android есть много статей об утечках памяти. Проверьте их, пожалуйста:

https://proandroiddev.com/everything-you-need-to-know-about-memory-leaks-in-android-d7a59faaf46a

https://android.jlelse.eu/9-ways-to-avoid-memory-leaks-in-android-b6d81648e35e

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

Я не вижу утечки памяти в вашем коде.

В Java:

Утечка памяти происходит, когда сборщик мусора считает, что объект по-прежнему необходим, поскольку на него ссылается другой объект.

Общие источники утечки памяти:

  • Анонимный класс
  • Внутренние классы
  • методы обратного вызова
  • Stati c Переменные со ссылкой на активность или фрагмент
  • Rx Java
  • AsyncTask
  • TimerTask
  • Обработчики
  • Синглтон

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

...