Android MVP入門から進級へ-Dagger 2を結合

5996 ワード

前言
本シリーズは3編:Android MVP入門から進級へ-簡単入門Android MVP入門から進級へ-Dagger 2 Android MVP入門から進級へ-システムフレームワーク統合(完結)
昨日、1篇のmvp入門フレームワークの構築文章Android MVP入門から進級まで-簡単入門簡単な例を通じて、mvpの簡単な使用を紹介して、今日私達は依然としてdemoからmvpモードを紹介して注釈フレームワークDagger 2の使用を結合して、本文はdagger 2の使い方を紹介しないことに注意して、dagger 2がmvpフレームワークを結合してどのように更に結合するかだけを簡単に紹介します.dagger 2の使い方が分からない場合は、公式ドキュメントDagger 2を参照するか、以下の文章を読んでください:Dagger 2入門、初心者の角度でdagger 2詳しく説明します.ここでは、以上の文章の著者に感謝し、良い学習ガイドを提供してください.
Dagger 2を使うメリットは何ですか?
1.      、           
2.        
3.   

話があまりないので、demoを書き始めましょう.
依存の追加
moduleのbuild.gradleにDagger 2の依存を追加
    implementation 'com.google.dagger:dagger:2.16'
    implementation 'com.google.dagger:dagger-android:2.16'
    implementation 'com.google.dagger:dagger-android-support:2.16'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.16'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.16'

アプリケーションのインスタンスを提供するためのAppModuleクラスの書き込み
/**
 * @desc AppModule
 * @author Marlon
 * @date 2018/10/9
 */
@Module
public class AppModule {
    private final App application;

    public AppModule(App application) {
        this.application = application;
    }

    @Provides
    @Singleton
    App provideApplicationContext() {
        return application;
    }
}

書き込みAppComponentインタフェースAppModuleの管理
/**
 * @desc AppComponent     Application 
 * @author Marlon
 * @date 2018/10/9
 */
@Singleton
@Component(modules = {AppModule.class/*, HttpModule.class*/})
public interface AppComponent {

    App getContext();  //   App Context

//    BaseApiService retrofitHelper();  //  http            ,   
}

Activity Moduleインタフェースの書き込みActivityインスタンスの提供
/**
 * @desc ActivityModule
 * @author Marlon
 * @date 2018/10/9
 */

@Module
public class ActivityModule {
    private Activity mActivity;

    public ActivityModule(Activity activity) {
        this.mActivity = activity;
    }

    @Provides
    @ActivityScope
    public Activity provideActivity() {
        return mActivity;
    }
}

Activity Componentインタフェースを書き込み注入に依存するActivityを登録
/**
 * @desc ActivityComponent              Activity
 * @author Marlon
 * @date 2018/10/9
 */
@ActivityScope
@Component(dependencies = AppComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {

    Activity getActivity();

    void inject(MainActivity mainActivity);//    MainActivity
    void inject(LoginActivity loginActivity);//    LoginActivity
    //TODO        Activity                    
}

書くApp類
/**
 * @desc App
 * @author Marlon
 * @date 2018/10/9
 */
public class App extends Application {
    private static App instance;
    public static AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static synchronized App getInstance() {
        return instance;
    }

    public static AppComponent getAppComponent() {
        if (appComponent == null) {
            appComponent = DaggerAppComponent.builder()
                    .appModule(new AppModule(instance))
//                    .httpModule(new HttpModule())         module      ,
                    .build();
        }
        return appComponent;
    }

}

LoginActivityでnew LoginPresenterを削除LoginPresenterに注記@Injectを追加
/**
 * @desc LoginActivity
 * @author Marlon
 * @date 2018/10/9
 */
public class LoginActivity extends AppCompatActivity implements LoginContract.View {
    @Inject
    LoginPresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        DaggerActivityComponent.builder().appComponent(App.getAppComponent()).activityModule(new ActivityModule(this)).build().inject(this);
        mPresenter.attachView(this);
    }

    @Override
    public void gotoMain() {
        startActivity(new Intent(this,MainActivity.class));
    }

    @Override
    public void showToast(String msg) {
        Toast.makeText(this.getApplicationContext(),msg,Toast.LENGTH_SHORT).show();
    }

    public void onClickLogin(View view) {
        mPresenter.login();
    }
}

修正後のLoginPresenterをもう一度見て
/**
 * @author Marlon
 * @desc
 * @date 2018/10/8
 */

public class LoginPresenter implements LoginContract.Presenter {

    LoginActivity view;
    @Inject
    public LoginPresenter() {

    }

    @Override
    public void login() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    view.showToast("    ");
                    view.gotoMain();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


    @Override
    public void attachView(LoginContract.View view) {
        this.view = (LoginActivity) view;
    }

    @Override
    public void detachView() {
        this.view = null;
    }
}

ここまで私たちのdemoの大まかな内容はすでに終わって、とても簡単で、いくつかの簡単な注釈で、私たちはPresenterとViewの完全なデカップリングを実現して、newキーワードを見ていないで、構造方法の中のパラメータも見ていないで、とてもすばらしいですか?このプロジェクトdemoはここにあります.もっと詳しい知識が入っています.必要なものがあれば調べてみてください.もしあなたに役に立つと思ったら、気をつけてください.何か問題があったら、フィードバックしてください.皆さん、一緒に勉強してください.本プロジェクトdemoは依然として公式googlesamples/android-architectureのtodo‑mvp‑dagger分岐を簡略化しています.私たちが普段開発していない注釈の大部分を除いて、十分なDagger 2の基礎があれば、公式demoを調べて、もっと多くの知識が待っていますよ.
まとめ
この2日間の総括を通じて、私たちのチームのmvpと協力daggerは一定の理解を持っていて、もとはmvp+daggerのアーキテクチャの構築がこんなに簡単だと思っています.はい、私たちの学者にとって、確かに一定の収穫がありますが、私たちのプロジェクトはまだ簡単で、まだネットの要求に関連していません.私たちは会社でプロジェクトをするのにどうしてネットの要求が欠けているのか、これは少なくありません.そこで次の記事ではAndroid MVP入門からステップアップへのシステムフレームワーク統合(完結)についてまとめます
この文章はオリジナルブログです.転載は出典を明記してください.