【Android - 框架】之Dagger2+MVP的用法


  MVP模式本身相比於MVC模式就已經把View層和Controller層從Activity中進行了分離,將Model層和View層用Presenter層隔開,實現了初步的解耦。如果再加入Dagger2框架,就可以進一步解耦。

  Dagger2使用的是依賴注入的思想,通過annotation注解的方式實現模塊間的解耦,讓“只寫一小部分代碼就可以使一切聯系起來”成為了可能(削減了程序中的耦合問題)。Dagger是目前為止唯一一個可以生成完整模仿用戶手寫的可追蹤的代碼的DI框架。

  Dagger2中有很多注解標簽,其中一些及其功能列舉如下:

    @Module:Modules類里面的方法專門提供依賴,所以我們定義一個類,用@Module注解,這樣Dagger在構造類的實例的時候,就知道從哪里去找到需要的依賴。
        modules的一個重要特征是它們設計為分區並組合在一起(比如說,在我們的app中可以有多個組成在一起的modules)
    @Provides:在modules中,我們定義的方法是用這個注解,以此來告訴Dagger我們想要構造對象並提供這些依賴。
    @Singleton:當前提供的對象將是單例模式 ,一般配合@Provides一起出現
    @Component:用於接口,這個接口被Dagger2用於生成用於模塊注入的代碼
    @Inject:在需要依賴的地方使用這個注解。(你用它告訴Dagger這個 構造方法,成員變量或者函數方法需要依賴注入。這樣,Dagger就會構造一個這個類的實例並滿足他們的依賴。)
    @Scope:Dagger2可以通過自定義注解限定注解作用域。

  這個DEMO中用到的標簽只有前五個,@Scope標簽暫時沒有用到。

  下面直接上代碼。首先申明一下,這個DEMO中用到的MVP就不加介紹了,有興趣的朋友可以通過最后的傳送門到我上一個帖子中查看。

  在gradle文件中添加依賴(主要是apt、dagger、butterknife有關的代碼):

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"
    defaultConfig {
        applicationId "com.example.itgungnir.testdagger"
        minSdkVersion 11
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
    // Dagger的依賴包
    apt 'com.google.dagger:dagger-compiler:2.2'
    compile 'com.google.dagger:dagger:2.2'
    // ButterKnife的依賴包
    compile 'com.jakewharton:butterknife:5.1.1'
}

  MainActivity.java類中的代碼:

public class MainActivity extends AppCompatActivity implements MainContract.IView {
    @Inject
    MainPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 初始化ButterKnife
        ButterKnife.inject(this);
        // Dagger注入
        DaggerMainComponent.builder().mainModule(new MainModule(MainActivity.this)).build().inject(this);
    }

    @OnClick(R.id.btn)
    public void click() {
        onButtonClicked("Button Clicked!!!!");
    }

    @Override
    public void onButtonClicked(String text) {
        presenter.onButtonClicked(MainActivity.this, text);
    }
}

  MainContract.java類中的代碼:

public class MainContract {
    interface IView {
        void onButtonClicked(String text);
    }

    interface IModel {
        void onButtonClicked(Activity activity, String text);
    }

    interface IPresenter {
        void onButtonClicked(Activity activity, String text);
    }
}

  MainModel.java類中的代碼:

public class MainModel implements MainContract.IModel {

    @Override
    public void onButtonClicked(Activity activity, String text) {
        Toast.makeText(activity, text, Toast.LENGTH_SHORT).show();
    }
}

  MainPresenter.java類中的代碼:

public class MainPresenter implements MainContract.IPresenter {
    private MainContract.IModel model;
    private MainContract.IView view;

    public MainPresenter(MainContract.IView view) {
        this.view = view;
        this.model = new MainModel();
    }

    @Override
    public void onButtonClicked(Activity activity, String text) {
        model.onButtonClicked(activity, text);
    }
}

  MainModule.java類中的代碼:

@Module
public class MainModule {
    MainPresenter presenter;

    public MainModule(MainActivity activity) {
        presenter = new MainPresenter(activity);
    }

    @Provides
    @Singleton
    MainPresenter providesMainPresenter() {
        return presenter;
    }
}

  MainComponent.java接口中的代碼:

@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {
    void inject(MainActivity activity);
}


  最后貼一下MVP的傳送門地址:

  【傳送門】之MVP的使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM