В архитектуре MVP (Model-View-Presenter) объекты presenter являются основной логической частью, отвечающей за взаимодействие между моделью (бизнес-логикой) и представлением (UI). Когда объект presenter становится ненужным, например, при закрытии активности или фрагмента в Android приложении, его нужно корректно уничтожить. В данном ответе я расскажу о двух методах уничтожения объекта presenter.
1. Уничтожение presenter с помощью жизненного цикла Activity/Fragment:
Одним из распространенных способов уничтожения presenter является его привязка к жизненному циклу Activity или Fragment. Для этого обычно используют Dependency Injection (DI) фреймворки, такие как Dagger, Koin или Hilt. Следуя этому подходу, создается компонент, который предоставляет presenter, и этот компонент связывается с жизненным циклом активности или фрагмента таким образом, чтобы presenter был создан вместе с активностью или фрагментом и уничтожался при их закрытии. Например, в случае использования Dagger 2:
@Module public class PresenterModule { @Provides public MyPresenter provideMyPresenter() { return new MyPresenter(); } }
public class MyActivity extends AppCompatActivity { @Inject MyPresenter myPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... MyApp.getComponent().inject(this); // ... } // ... }
2. Ручное уничтожение presenter:
В некоторых случаях может потребоваться выполнять уничтожение presenter вручную, например, когда активность или фрагмент не связаны с жизненным циклом или когда активность или фрагмент могут быть закрыты, но presenter все еще используется. В таких случаях необходимо вызвать метод уничтожения presenter вручную. Обычно этот метод реализуется в интерфейсе контракта между presenter и представлением, например:
public interface MyContract { interface View { void showData(List<Data> data); // ... } interface Presenter { void loadData(); void onDestroy(); // метод, вызываемый для уничтожения presenter } }
public class MyPresenter implements MyContract.Presenter { private MyContract.View view; @Override public void loadData() { // загрузка данных } @Override public void onDestroy() { // освобождение ресурсов или выполнение других необходимых операций при уничтожении presenter } }
Когда активность или фрагмент закрывается, вам нужно вызвать метод onDestroy() презентера:
public class MyActivity extends AppCompatActivity implements MyContract.View { private MyContract.Presenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... presenter = new MyPresenter(); // ... } // ... @Override protected void onDestroy() { super.onDestroy(); presenter.onDestroy(); } }
Таким образом, объект presenter может быть уничтожен с помощью привязки к жизненному циклу Activity/Fragment или путем ручного вызова метода onDestroy(). Какой подход использовать зависит от конкретных требований и особенностей вашего приложения.