Как уничтожить объект presenter в MVP архитектуре?

В архитектуре 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(). Какой подход использовать зависит от конкретных требований и особенностей вашего приложения.