2016-10-01 9 views
0

Я хотел бы спросить о том, как работает MVP и кинжал. Таким образом, в разработке Android мы знаем, что Activity и фрагмент - это представление, и мы делаем презентатора, реализуя наблюдателя (в моем случае im использует rxjava + retrofit). И кинжал в этом случае я использую для добавления службы Rest (Network Component -> retrofit).Dagger2: введите Api Module в презентатор (MVP)

Я до сих пор путаю, чтобы ввести службу Rest для моего ведущего, потому что весь пример, который я нашел, вводит в действие.

вот мой код.

Как зрения:

public class PageFragment extends Fragment implements ScheduleViewInterface{ 
private ScheduleCursorAdapter scheduleAdapter; 
@Inject RestApi restApiInject; 
private SchedulePresenter mPresenterJson; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    App.getApiComponent(getActivity()).inject(this); 
    mPresenterJson.fetchSchedule(); 
} 

@Override 
public Observable<ScheduleList> getSchedule() { 
    return restApiInject.getScheduleListByUrl("url here"); 
} 

Как ведущий:

public class SchedulePresenter implements Observer<ScheduleList> { 
private ScheduleViewInterface mInterface; 

public SchedulePresenter(ScheduleViewInterface viewInterface){ 
    mInterface = viewInterface; 
} 

@Override 
public void onCompleted() { 
    mInterface.jsonCompleted(); 
} 

@Override 
public void onError(Throwable e) { 
    mInterface.jsonError(e.getMessage()); 
} 

@Override 
public void onNext(ScheduleList scheduleList) { 
    mInterface.jsonScheduleList(scheduleList); 
} 

public void fetchSchedules(){ 
    unSubscribeAll(); 
    subscribe(mInterface.getSchedule(), SchedulePresenter.this); 
} 

и это мой dagger2 код

@CustomScope 
@Component(modules = ApiModule.class, dependencies = NetworkComponent.class) 
public interface ApiComponent { 
MainActivity inject(MainActivity activity); 
PageFragment inject(PageFragment fragment); 
} 

Architecture pattern

+0

Вот образец. https://github.com/anupcowkur/MVPSample. – Raghunandan

+0

Я уверен, что ответ на ваш вопрос лежит на [ответе Дэвида Меденяка] (http://stackoverflow.com/questions/35605408/dagger-2-injection-in-non-activity-java-class) –

ответ

0

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

public class PopularMoviesPresenterImpl implements PopularMoviesPresenter { 

@Inject 
public PopularMoviesInteractor interactor; 

private PopularMoviesView view; 
private Subscription subscription = Subscriptions.empty(); 

@Inject 
public PopularMoviesPresenterImpl() { 
} 

@Override 
public void setView(PopularMoviesView view) { 
    this.view = view; 
} 

@Override 
public void destroy() { 
    if (subscription != null && !subscription.isUnsubscribed()) 
     subscription.unsubscribe(); 

    interactor.onDestroy(); 

    view = null; 
    interactor = null; 
} 

@Override 
public void loadPopularMoviesData(boolean isConnected, int page, int limit) { 

    if (null != view) { 
     view.showProgress(); 
    } 

    subscription = interactor.loadPopularMovies(page, limit).subscribe(movies -> 
      { 
       if (null != view) { 
        view.hideProgress(); 
        view.setPopularMoviesValue(movies); 

        if (!isConnected) 
         view.showOfflineMessage(); 
       } 
      }, 
      throwable -> { 
       if (null != view) { 
        view.hideProgress(); 
       } 

       if (isConnected) { 
        if (null != view) { 
         view.showRetryMessage(); 
        } 
       } else { 
        if (null != view) { 
         view.showOfflineMessage(); 
        } 
       } 
      }); 

}} 

Interactor является:

public class PopularMoviesInteractorImpl implements PopularMoviesInteractor { 
private TraktApi api; 
private SchedulerProvider scheduler; 

private ReplaySubject<Movie[]> moviesDataSubject; 
private Subscription moviesSubscription; 

@Inject 
public PopularMoviesInteractorImpl(TraktApi api, SchedulerProvider scheduler) { 
    this.api = api; 
    this.scheduler = scheduler; 
} 

@Override 
public Observable<Movie[]> loadPopularMovies(int page, int limit) { 
    if (moviesSubscription == null || moviesSubscription.isUnsubscribed()) { 
     moviesDataSubject = ReplaySubject.create(); 

     moviesSubscription = api.getPopularMovies(page, limit, Constants.API_EXTENDED_FULL_IMAGES) 
       .subscribeOn(scheduler.backgroundThread()) 
       .observeOn(scheduler.mainThread()) 
       .subscribe(moviesDataSubject); 
    } 

    return moviesDataSubject.asObservable(); 
} 

@Override 
public void onDestroy() { 
    if (moviesSubscription != null && !moviesSubscription.isUnsubscribed()) 
     moviesSubscription.unsubscribe(); 
}} 

интерфейс Interactor:

public interface PopularMoviesInteractor { 

Observable<Movie[]> loadPopularMovies(int page, int limit); 

void onDestroy();} 

и в вашем модуле записи:

@Provides 
public PopularMoviesInteractor provideInteractor(PopularMoviesInteractorImpl interactor) { 
    return interactor;} 

Interactor является предоставлено через constru . Фикция инъекции (вы можете сделать это с простой инъекции, хотя)

здесь чистый пример ПМК: http://github.com/mmirhoseini/fyber_mobile_offers

+0

Я не могу открыть ссылку, которую вы предоставили, пожалуйста, если вы хотите дать мне доступ (aunorafiq). скоро напишите это как ответ, спасибо – Raffu

+0

https://github.com/mmirhoseini/trakt.tv –

0

Я вижу, что этот вопрос уже ответил. Но если вам нужен ясный пример того, как использовать инъекцию зависимостей в архитектуре MVP, я бы действительно предложил вам проверить этот boilerplate, поскольку он полностью основан на DI с использованием Dagger2, и он соответствует архитектуре MVP.

Зависимости в настоящее время обрабатывается котельными пластинами являются следующим: зависимости

  • База данных: инкапсулирует все операции с базой данных.
  • Отношение общих предпочтений: относится к общим предпочтениям.
  • Зависимость локальных файлов: что касается сохранения файлов.
  • Зависимость от Google Analytics: охватывает всю работу отчетов о событиях в вашем аналитическом бэкэнд (GA, сегмент, FB, Flurry ..)
  • Logging зависимости: инкапсулирует все операции, связанные с ведением журнала консоль
  • Api зависимости: инкапсулирует все операции, связанные с API

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

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

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