Android MVP: какой слой должен хранить контекстную переменную
Я нахожусь там, где мне нужно воспроизвести звуковой файл, когда пользователь нажимает кнопку на представлении.
MediaPlayer требует создания контекста.
каков наилучший способ поместить код инициализации MediaPlayer?
должен ли я передать контекст в метод presenter и воспроизвести его там?
или это нормально, чтобы просто играть на вид.
3 ответов
Context
является частью Android View
слой в MVP, так что Presenter
не должно иметь никакого представления об этом, и вы не должны передавать его presenter
.
вы должны добавить методы в свой View
интерфейс и реализовать его внутри компонентов Android view (т. е. Activity
или Fragment
) и использовать их для действий в View
layer как воспроизведение звука.
Presenter
необходимо запросить событие UI и View
должны справиться с этим!
здесь MVP пример использования Кинжал, RxJava и модернизация, что может помочь вам узнать больше о MVP в Android:
Я часто ставлю код бизнес-логики в Модель Слоя (не путайте с моделью в базе данных). Я часто переименовываю как XManager
для избежания путаницы (например,ProductManager
, MediaManager
...) поэтому presenter class просто использует для ведения рабочего процесса.
эмпирическое правило-нет или, по крайней мере, ограничение импорт пакета android в классе presenter. Эта лучшая практика поддерживает вас проще в тестировании класса presenter, потому что presenter теперь просто класс java, поэтому нам не нужна Android framework для тестирования этих вещей.
например, вот мой рабочий процесс mvp.
посмотреть класс: это место, где вы храните все ваши представления, такие как кнопка, textview ... и вы устанавливаете все прослушиватели для этих компонентов представления на этом слое. Также в этом представлении вы определяете класс прослушивателя для реализации presenter позже. Компоненты представления будут вызывать методы в этом классе прослушивателя.
class ViewImpl implements View {
Button playButton;
ViewListener listener;
public ViewImpl(ViewListener listener) {
// find all view
this.listener = listener;
playButton.setOnClickListener(new View.OnClickListener() {
listener.playSong();
});
}
public interface ViewListener {
playSong();
}
}
ведущий класс: здесь вы храните представление и модель внутри для вызова позже. Также класс presenter будет реализовывать интерфейс ViewListener, определенный выше. Суть ведущий логика управления рабочим процессом.
class PresenterImpl extends Presenter implements ViewListener {
private View view;
private MediaManager mediaManager;
public PresenterImpl(View, MediaManager manager) {
this.view = view;
this.manager = manager;
}
@Override
public void playSong() {
mediaManager.playMedia();
}
}
менеджер класс: вот основной код бизнес-логики. Возможно, у одного докладчика будет много менеджеров (зависит от того, насколько усложнено представление). Часто мы получаем Context
класс через некоторые рамки впрыски как Dagger
.
Class MediaManagerImpl extends MediaManager {
// using Dagger for injection context if you want
@Inject
private Context context;
private MediaPlayer mediaPlayer;
// dagger solution
public MediaPlayerManagerImpl() {
this.mediaPlayer = new MediaPlayer(context);
}
// no dagger solution
public MediaPlayerManagerImpl(Context context) {
this.context = context;
this.mediaPlayer = new MediaPlayer(context);
}
public void playMedia() {
mediaPlayer.play();
}
public void stopMedia() {
mediaPlayer.stop();
}
}
и наконец: поставить эти вещи вместе в деятельности, фрагменты ... Здесь вы инициализируете представление, менеджер и назначаете все презентатору.
public class MyActivity extends Activity {
Presenter presenter;
@Override
public void onCreate() {
super.onCreate();
IView view = new ViewImpl();
MediaManager manager = new MediaManagerImpl(this.getApplicationContext());
// or this. if you use Dagger
MediaManager manager = new MediaManagerImpl();
presenter = new PresenterImpl(view, manager);
}
@Override
public void onStop() {
super.onStop();
presenter.onStop();
}
}
вы видите, что каждый ведущий, Модель, представление обернуты одним интерфейсом. Эти компоненты будут вызываться через интерфейс. Этот дизайн сделает ваш код более надежным и простым для последующего изменения.
Это такой длинный пост для ответа на ваш вопрос. Я думаю это подходит, потому что у каждого есть своя реализация MVP (основной поток одинаковый, но меньшинства разные). Поэтому я представляю здесь рабочий процесс, который я часто использую в работе. Надеюсь, вы видите это полезным:)
Если вам нужен общий контекст, вы можете расширить приложение, объявить статическую переменную контекста и после того, как вы можете получить этот контекст в своем презентаторе.