2016-10-01 11 views
0

MVPと短剣の動作方法について質問したいと思います。したがって、アンドロイドの開発では、アクティビティとフラグメントがビューであることがわかります。私はオブザーバを実装してプレゼンタを作成します(私の場合、rxjava + retrofitを使用しています)。この場合の短剣は、レストサービス(ネットワークコンポーネント→改造)を注入するために使用します。Dagger2:プレゼンターにApiモジュールを挿入する(MVP)

私が見つけたすべての例がアクティビティに注入されているので、レストサービスをプレゼンターに注入するのはまだ混乱します。

ここは私のコードです。ビューとして

:プレゼンターとして

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

あなたの質問に対する答えが[David Medenjakの回答]にあるとはかなり確信しています(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(); 
        } 
       } 
      }); 

}} 

相互作用物質は、次のとおりです。

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(); 
}} 

インタラクインタフェース:

public interface PopularMoviesInteractor { 

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

void onDestroy();} 

とあなたのモジュール書き込み中:

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

インタラクタされますコンストラルを通じて提供された。ction注射(あなたがが簡単な注射でそれを行うことができます)

ここでは、MVPのクリーンな例である: http://github.com/mmirhoseini/fyber_mobile_offers

+0

あなたが私にアクセス(aunorafiq)を与えてもらえたら、あなたが提供したリンクを開くことはできません。 すぐにこれを回答としてマークしてください、ありがとうございます – Raffu

+0

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

0

私はこの質問が既に回答されたことがわかります。しかし、MVPアーキテクチャで依存関係注入を使用する方法の明確な例が必要な場合は、Dagger2を使用するDIに完全に基づいており、MVPアーキテクチャに従っているので、これを確認することをお勧めします。boilerplate

現在ボイラープレートで扱う依存関係は以下の通りである:

  • データベース依存性:すべてのデータベース操作をカプセル化します。
  • 共有設定依存関係:共有設定を扱います。
  • ローカルファイルの依存性:ファイルの保存を扱います。
  • Analyticsの依存関係:分析バックエンド(GA、Segment、FB、Flurry ..)にイベントを報告するすべての操作をカバーします。)
  • ロギング依存性は:あなたのコンソールへのロギングに
  • のAPI依存関係に関連するすべての操作をカプセル化します:カプセル化し、すべてのAPI関連の操作

依存性注入のパワーは、特にテストのために本当に便利来るあなたが簡単にできるので、テスト環境での依存関係をダミー依存関係に切り替えます。

関連する問題