android dagger 2注入mvpアーキテクチャ
このブログではdagger 2を用いて簡単なmvpアーキテクチャを構築する文章をいくつかの部分に分けています.
ポイントはdagger 2なので.ネットワーク部分はカプセル化されず、rxjava+retrofitが一般的です.これは自分の実情と結びつけて、バックグラウンドではなく、パッケージも違います.
第一部mvpアーキテクチャ
mvpはみんなよく知っていると思います.私はくだらないことを言いません.ここでは簡略化されたviewとpresenterを採用し,プロジェクトはm層を用いられない.Activityとfragmentはuiを担当し、presenterはデータのロードを担当し、ネットワーク要求を担当し、ロードが完了したらインタフェースを通じてactivityとfragmentに戻ります.これは簡単なmvpアーキテクチャです.activity圧力を軽減
第2部dagger 2の使用について簡単に説明する
dagger 2の原理と詳細はすでに多くの文章がよく書かれています.私は簡単に使い方を言えばいいです.まずこんなものがいくつかあります.Component Moduleとscopeです.この3つのものは完全な注入です.アプリケーションレベルのComponentはアプリケーションで初期化する必要があり、activityレベルの必要はactivityで初期化する必要があります.fragmentはactivityと同じです.
まずパッケージを導入
compile 'com.google.dagger:dagger:2.7'
provided 'com.google.dagger:dagger-compiler:2.6.1'
Scope Module Component
@Scope
public @interface ActivityScope {
}
こんなに簡単です.
@Module
public class TestModule {
public TestModule(Activity a) {
}
@Provides
@ActivityScope// soupe
public String provideBindMobActivity() {
return new String("xx");
}
public class Student {
private String name;
@Inject
public Student(String name) {
this.name = name;
}
}
最後に使用
@inject
Student xiaoming;
xiaomingのstudentの例があります.
まとめると、新しいmoduleを作成するには、クラス注釈moduleを追加する必要があります.これにより、dagger 2はmoduleであることを知っています.studentの構造はstringを受け入れ、moduleのproviderメソッドはちょうどstringを返します.これにより、newを書く必要がなくstudentをインスタンス化することができます.
@ActivityScope
@Component(modules = TestModule.class)
public interface Testcomponent {
void inject(Activity a)
}
ルールは、まずscopeの役割ドメインであり、これはあなたのmodule上のproviderメソッドのscopeに対応しています.それからこのようなインタフェースで、Componentを使ってmoduleとinjectを関連付けました.そうですね.インタフェースにはactivity注入を行うinectメソッドがあります
dagger 2はそうです.簡単に理解してください.次はdagger 2とmvpの結合で、後でコードが与えられます.
dagger 2とmvpの結合
上のmvpアーキテクチャは,new newがdagger 2依存注入厚を採用する必要があり,newでは必要ない.まずdagger 2のappレベルの初期化です.それとも3つの部分に分けてModule
@Module
public class AppModule {
private Application application;
public AppModule(Application application) {
this.application = application;
}
}
Component
@Singleton
@Component(modules = AppModule.class)
public interface Appcomponent {
}
および注入初期化コード.アプリレベルはもちろんアプリケーションで初期化します
public class MyApplication extends Application {
private static MyApplication mInst;
private Appcomponent mAppcomponent;
@Override
public void onCreate() {
super.onCreate();
mInst = this;
mAppcomponent = DaggerAppcomponent. //Dagger + component
builder()
.appModule(new AppModule(this)) // App Module
.build();
}
public static MyApplication getInst() {
return mInst;
}
public Appcomponent getAppComponent() {
return mAppcomponent;
}
}
appレベルの初期化が完了すると、activityレベルを続行できます.まだ3つの部分です
moduleの構造はactivityを受け入れ、providerは直接戻ります.
@Module
public class ActivityModule {
BaseMVPActivity activity;
public ActivityModule(BaseMVPActivity activity) {
this.activity = activity;
}
@Provides
@ActivityScope
public BaseMVPActivity provideBindMobActivity() {
return activity;
これのComponent dependenciesはappを1つ持っていて、この点は関係を継承するようで、appの中のを使うことができて、自分のはActivity Moduleです.
@ActivityScope
@Component(dependencies = Appcomponent.class,
modules = ActivityModule.class)
public interface Activitycomponent {
void inject(MainActivity activity);
// Component
// void inject(SecondActivity activity);
// void inject(Tread activity);
}
最後のステップはactivityに注入を初期化しactivityに自然にactivityに書くことです
抽象的な親に書いてあります
public abstract class BaseMVPActivity extends AppCompatActivity implements BaseMvpViewInterface {
@Inject// Presenter inject 。
protected P mvpPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initInject(DaggerActivitycomponent.builder()
.appcomponent(MyApplication.getInst().getAppComponent())
.activityModule(new ActivityModule(this))
.build());
mvpPresenter.attachView(this);
}
protected abstract void initInject(Activitycomponent activityComponent);
@Override
protected void onDestroy() {
super.onDestroy();
if (mvpPresenter != null) {
mvpPresenter.detachView();
}
}
}
public class MainActivity extends BaseMVPActivity implements MainAcView {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mvpPresenter.loadData();
}
@Override
protected void initInject(Activitycomponent activityComponent) {
activityComponent.inject(this);
}
@Override
public void loadSucess(String string) {
Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
mvpPresenter.detachView();
}
}
抽象親クラスは抽象メソッドで、サブクラスを注入し、injectで表記されたpreseterはnewに必要ありません.
こんな感じです.新しいmvpのactivityを作成するたびに、あまり操作する必要はありません.親抽象的な方法を実装し、注入すればいいだけです.
demoアドレスhttps://github.com/836154942/simpledaggermvp