Moxy — библиотека, упрощающая реализацию паттерна MVP (Model View Presenter) в Android. Основные особенности использования:
Пример использования:
interface MovieDescriptionView : MvpView {
    fun bindMovie(movie: UiFullMovie)
    @StateStrategyType(OneExecutionStateStrategy::class)
    fun openVideoActivity(videoUrl: String)
}
После того, как презентером был вызван bindMovie(), этот метод помещается в очередь вызовов viewstate c дефолтной стратегией (про стратегии по ссылкам выше много информации). При каждом возвращении View в активное состояние (после переворота экрана, возвращение на экран по стеку и т.д.) метод с параметрами будет вызван повторно, что позволяет держать экран в актуальном состоянии без ручной обработки восстановления экрана. Метод openVideoActivity() в силу примененной стратегии OneExecutionStateStrategy так себя не ведет, а вызывается один раз.
@InjectViewState
class MovieDescriptionPresenter(private val movie: UiFullMovie) : MvpPresenter<MovieDescriptionView>() {
    override fun createComponent(component: ProjectComponent) {
        DaggerMocvieDescriptionComponent.builder()
                .projectComponent(component)
                .build()
                .inject(this)
    }
    override fun onFirstViewAttach() {
        super.onFirstViewAttach()
        viewState.bindMovie(movie)
    }
    fun onPlayTrailerClick(videoUrl: String) {
        viewState.openVideoActivity(videoUrl)
    }
}
Пример реализации Presenter'а, который работает с MovieDescriptionView. Метод onPlayTrailerClick() вызывается из фрагмента.
Важно: общение между View и Presenter происходит только в «одностороннем порядке». Например, правильная обработка SwipeRefreshLayout:код во фрагменте:
moviesRefreshLayout.setOnRefreshListener { presenter.reloadData() }
Код в презентере:
fun reloadData() {
    viewstate.startLoad()
    loadItems {
        viewstate.stopLoad()
        viewstate.swapData(it)
    }
}
View не должно подписываться на загрузку данных через презентер. View не должно забирать данные у презентера через get'еры. View только отображает данные и реагирует на пользовательские действия вызовом методов презентера.