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

ViewModel имеет ссылку на прослушиватель, определенный в действии. Теперь при изменении ориентации устройства произойдет ли утечка памяти?

Код:

public class MainVM extends ViewModel {

private Listener listener;

public void setListener(Listener listener) {
this.listener = listener;
}

...
}
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

MainVM mainVM = new ViewModelProvider(this).get(MainVM.class);

mainVM.setListener(new Listener() {
//methods
});

}

}

comment
Это зависит от того, содержит ли ваш слушатель какую-либо ссылку на саму активность, но, как правило, это не очень хорошая идея и, скорее всего, утечка.   -  person Pawel    schedule 03.09.2020


Ответы (1)


Обычно нет. Это эталонный график при создании первого действия.

Android --> mainActivity1 --> mainVM1 --> listener1

При повороте телефона первая активность уничтожается и создается новая.

            mainActivity1 --> mainVM1 --> listener1
Android --> mainActivity2 --> mainVM2 --> listener2

Поскольку на mainActivity1 нет корневых указателей, он может быть удален сборщиком мусора. То же самое было бы верно, даже если mainVM1 или listener1 указывают на mainActivity1.

Было бы неверно, если бы в mainVM1 были указатели на mainActivity1 И был бы корневой указатель на mainVM1, который поддерживал бы его в рабочем состоянии.

Проблема не в том, что есть что-то, указывающее на мою деятельность, а есть что-то, указывающее на мою деятельность, которая живет гораздо дольше, чем сама деятельность.

person corradolab    schedule 02.09.2020
comment
mainVM2 в вашем образце не существует, так как ViewModelProvider вернет существующий экземпляр модели представления после поворота. В этом случае новый слушатель перезапишет старый в mainVM1. Практически это предотвратит утечку mainActivity1, но хорошая практика с компонентами, учитывающими жизненный цикл, такими как активность, состоит в том, чтобы очищать все ссылки на него, как только они уничтожаются. - person Pawel; 03.09.2020
comment
Если конфигурация изменяется, ViewModel не влияет, т. е. та же модель представления будет использоваться для действия/фрагмента. - person Mohit Rajput; 17.05.2021