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:

https://github.com/mmirhoseini/marvel


Я часто ставлю код бизнес-логики в Модель Слоя (не путайте с моделью в базе данных). Я часто переименовываю как 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 (основной поток одинаковый, но меньшинства разные). Поэтому я представляю здесь рабочий процесс, который я часто использую в работе. Надеюсь, вы видите это полезным:)


Если вам нужен общий контекст, вы можете расширить приложение, объявить статическую переменную контекста и после того, как вы можете получить этот контекст в своем презентаторе.