2017-01-20 12 views
0

Я читал статью Дарио Миличича относительно MVP here. Я также тщательно просмотрел код, который он предоставил на git hub. В любом случае, я довольно новичок в MVP для Android и MVP в целом, и поэтому у меня есть вопрос о том, что он сказал: «Уровень реализации - это то, где происходит вся конкретная инфраструктура». Что делать, если у меня есть приложение для Android, работающее с Bluetooth? то есть у меня есть небольшое приложение, чтобы получить список устройств Bluetooth с помощью BluetoothAdapter, который является андроид класса. Так что я начал писать сценарии использования которых было что-то вроде этогоАндроид MVP и код специфического кода

public interface BluetoothScanInteracotor { 
    interface View { 
     void onScanStarted(); 
     void onScanCompleted(); 
    } 
    void scanForDevices(); 
} 

, но потом понял, что я не могу сделать это из-за его базовая спецификация

Простите меня, если это глупый вопрос, но я могу смутить что-то, и мне нужно, чтобы кто-то помогите мне понять.

ответ

1

Проблема с большинством реализаций MVP заключается в том, что они обозначают действия и фрагменты в виде представлений и предлагают использовать «независимые от Android рамки».

Это звучит хорошо, пока вы не сталкиваетесь с такими проблемами, как ваша. Интерфейс Bluetooth является частью платформы Android, поэтому неясно, как использовать его в презентаторе, который не должен зависеть от конкретных классов Android.

После изучения архитектуры MVx на Android в течение нескольких лет я понял, что единственный разумный вывод, который можно получить, заключается в том, что действия и фрагменты не являются представлениями, а ведущими.

Более подробное обсуждение этой темы можно найти здесь: Why Activities in Android are not UI Elements.

Основываясь на этой идее, я предложил альтернативную реализацию MVP в Android: MVP and MVC Architectures in Android.

+0

ах да я думаю, что я прочитал ваш комментарий указывает это на одном из постов, касающихся MVP. Хм, хорошо, я думаю, это зависит от того, какое приложение я тоже создаю.Глядя на его код на github, все, кажется, отлично работает и рука об руку. –

+0

@ Евгения Даниленко, да, это именно то, что я тоже думал. Я сам пробовал кучу подходов, включая эту «чистую архитектуру» (BTW, она уходит корнями в идеи Роберта «Дядя Боб» Мартина). Проблема в том, что они не предназначены для Android, что ужасно в разделе «Разделение проблем и принцип единой ответственности». Таким образом, эти подходы хорошо смотрятся на бумаге, но разрываются на деле нетривиальные приложения. Просто подумайте о разрешениях во время выполнения - вы не можете проверить, что эта логика работает без тестирования кода интеграции в действиях ... Во всяком случае, проверьте это самостоятельно - возможно, я ошибаюсь ... – Vasiliy

+0

Эй, васили, не делайте этот комментарий кормит поток собственного ха-ха, но, я должен спросить, после строки 64, как линия 79 получает уведомление [ссылка] (http://www.techyourchance.com/mvp-mvc-android-3/)? Я попытался выполнить поиск в вашем проекте github, но я ударил стену, и это привело меня к методу post вашего потока. –

2

Подход CLEAN должен состоять в реализации BluetoothDeviceRepository, который может иметь несколько реализаций, один из которых будет фактически получать доступ к системным ресурсам, но может быть легко заменен для одного без внешних зависимостей для тестирования и т. Д. Сканирование устройства Bluetooth результаты будут преобразованы реализацией репозитория, чтобы вернуть POJO-модели, которые представляли необходимую вам информацию, чтобы не было утечки системных классов Android в этот уровень.

+0

Да, я думал о создании новой модели для этого, но потом я подумал, что это воссоздает то, что я бы тоже хотел избежать –

+1

И вот что вы в конечном итоге сделаете много с помощью подхода CLEAN. :) Это действительно делает модульное тестирование намного проще, хотя, несмотря на то, что иногда кажется большим количеством дополнительной печати. –

+0

Да, я думаю, отчасти заставляет меня взять некоторый контроль над тиннами –

0

У меня есть идея в модели MVP, что не плохо, чтобы поделиться с вами, Все, что зависит от операционной системы, следует рассматривать как вид, и Логика Presenter, Для примера деятельности является вид, мы используем его intract with UI, например получить Text Textview, а когда нам нужно обработать текст, мы создаем класс презентатора для этого действия, а также интерфейс для этого презентатора, затем реализуем интерфейс в презентаторе и вызываем методы интерфейса в Activity с необходимыми параметрами (например, Text)

Если я хочу реализовать его в другой ОС, я должен только изменить свою активность и получить текст по-другому, а остальное процесс будет таким же и не будет изменен

0

Как вы узнали основы Чистой Architechure. В следующем примере показано, как реализуется ваш шаблон MVP.

Пример:

interface BaseContract { 
     interface BaseView { 
      //Methods for View 
      void onDoSomething(); 
     } 

     interface BasePresenter { 
      void doSomething(); 

     } 
    } 

    class BaseMainPresenter implements BaseContract.BasePresenter { 
     BaseContract.BaseView view; 

     BaseMainPresenter(BaseContract.BaseView view) { 
      this.view = view; 
     } 

     @Override 
     public void doSomething() { 
      if (view != null) 
       view.onDoSomething(); 
     } 
    } 

    class DemoClass implements BaseContract.BaseView { 

     //Create object of Presenter 

     /**** 
     * Example : 
     * BaseMainPresenter baseMainPresenter = new BaseMainPresenter(this); 
     */ 
     @Override 
     public void onDoSomething() { 
      //Deal with Context here. 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^