Внедрение GoogleApiClient на Android mvp с использованием кинжала?
есть пара вопросов, которые у меня есть,
во-первых, когда я прочитал некоторые статьи, я должен реализовать интерфейсы LocationListener, ConnectionCallback, OnConnectionFailedListener в активности,
правильно ли разделять реализацию этих классов в разных файлах?
как показано ниже?
public class LocationListener implements
com.google.android.gms.location.LocationListener {
@Inject
Location mLastLocation;
@Override
public void onLocationChanged(Location location) {
// Assign the new location
mLastLocation = location;
// Displaying the new location on UI
}
}
Это правильно в моей деятельности, которую я обрабатываю Отображение свойств mLastLocation?
//Fields
@Inject
GoogleApiClient client;
Location mLastLocation;
//Fields
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(client);
second, Как мне написать метод провайдера для этого?. Мое предположение будет таким, что вы, ребята, порекомендуете?
//Constructor
public LocationModule(Context context, GoogleApiClient.ConnectionCallbacks callback, GoogleApiClient.OnConnectionFailedListener listener) {
this.context = context;
this.callback = callback;
this.listener = listener;
}
@Provides
@Singleton
GoogleApiClient providesGoogleApi() {
return new GoogleApiClient.Builder(context)
.addOnConnectionFailedListener(listener)
.addConnectionCallbacks(callback)
.addApi(LocationServices.API)
.build();
}
и, наконец, , где я должен обрабатывать разрешения для устройств Android и выше?, есть ли это на представлении или на презентаторе?
Я слышал, что представление должно быть настолько глупо, что вам не нужно его проверять, как я должен соблюдать этот принцип?
Если кто-нибудь может дать мне ссылку, или пример кода github, который соответствует моему случаю, который будет настолько велик.
Ответы
Ответ 1
Прежде всего, вы можете думать о уровне представления MVP как о чистом модуле Android, что означает, что любая связь с операционной системой Android, например, с запросом разрешения, должна обрабатываться с использованием этого уровня, и результат возвращается к ведущему, который решает, что делать следующий.
О разделении реализации этого класса я сам хочу выделить классы для более чистой визуализации, когда я ищу некоторый код класса! Я не думаю, что кто-то может предложить лучшую практику, потому что это зависит от вашего модуля и реализации. Согласно книге "Чистый код", в таких ситуациях принятия решений вам нужно больше думать о своей читаемости кода.
Наконец, о LocationModule, это абсолютно правильно, но если бы я был в ваших силах, я бы даже попросил контекст на более высоком уровне Компонент (например, ApplicationComponent) и удалить его из конструктора LocationModule.
//Constructor
public LocationModule(GoogleApiClient.ConnectionCallbacks callback, GoogleApiClient.OnConnectionFailedListener listener) {
this.callback = callback;
this.listener = listener;
}
@Provides
@Singleton
GoogleApiClient providesGoogleApi(Context context) {
return new GoogleApiClient.Builder(context)
.addOnConnectionFailedListener(listener)
.addConnectionCallbacks(callback)
.addApi(LocationServices.API)
.build();
}
Контекст может быть предоставлен с использованием соответствующего поставщика в более высоком модуле.
Вот пример репо, который действительно может помочь вам в этом отношении:
https://github.com/mmirhoseini/fyber_mobile_offers