MVP в Android — где размещать вызовы API Google для служб определения местоположения?

Я разрабатываю свое первое приложение для Android, и, поскольку мой код быстро становится огромным беспорядком, я решил следовать шаблону MVP.
Мое приложение разделено на представления (фрагменты), презентеры и контракты (интерфейсы с методами представления и докладчик будет использовать его для общения).
Моя проблема в том, что у меня есть форма, в которой есть поле с местоположением пользователя, которое я получаю с помощью API местоположения Google. У меня есть класс LocationHelper, который отвечает за проверку/запрос разрешений, создание клиента Google API, получение местоположения и т. д.
Однако я не знаю, куда поместить код, который использует этот класс: мой первый подход заключался в создании его экземпляра. в презентаторе, поскольку это больше бизнес-логика, чем материал пользовательского интерфейса, однако многим методам требуется активность вызывающей стороны в качестве параметра. Например, чтобы создать клиент Google API:

mGoogleApiClient = new GoogleApiClient.Builder(context)
            .addConnectionCallbacks((GoogleApiClient.ConnectionCallbacks) current_activity)
            .addOnConnectionFailedListener((GoogleApiClient.OnConnectionFailedListener) current_activity)
            .addApi(LocationServices.API).build();

Или запрос настроек местоположения:

status.startResolutionForResult(current_activity,REQUEST_CHECK_SETTINGS);

Однако из того, что я понял в MVP, у докладчика не должно быть кода контекста/андроида. Что было бы наилучшей практикой в ​​этом случае?


person MaggieD    schedule 30.10.2017    source источник
comment
Почему у ведущего обязательно не должно быть кода Android? Это довольно произвольное решение.   -  person Gabe Sechan    schedule 30.10.2017
comment
@Gabe Sechan, это противоречит цели тестирования. У вашего докладчика не должно быть кода Android, потому что теперь вы должны включить его в инструментальный тест, а не тестировать его без зависимости от Android.   -  person Rafa    schedule 01.12.2017
comment
@Rafa Нет, MVP должен иметь модель, представление и докладчик. Это единственные требования. Если вы хотите добавить другие требования, вы говорите не о MVP, а о чем-то другом, что может быть подмножеством MVP.   -  person Gabe Sechan    schedule 01.12.2017
comment
Вы правы, я оговорился, когда я сказал, что у вашего докладчика не должно быть никакого кода Android, что я действительно должен был сказать, что в контексте вопроса @MaggieD казалось, что она пыталась избежать размещения и кода SDK внутри своего ведущего, чтобы сохранить пассивный вид и облегчить ее тестирование. Я не имел в виду, что единственным способом работы mvp было, очевидно, сохранение контекста, но это не было произвольным решением.   -  person Rafa    schedule 01.12.2017


Ответы (1)


Я предлагаю вам прочитать эту ссылку. Вы можете использовать Dagger для внедрения контекста без необходимости передавать его докладчику, но я не думаю, что это плохая практика.

В своих проектах я часто использую эту строку в моем BasePresenter, чтобы получить все контексты, а не из Activity;

        this.mContext = CorretorApplication.getInstance().getApplicationContext();
person João Alvares Neto    schedule 30.10.2017