分享一下Dagger2的使用經驗 -开发者知识库

分享一下Dagger2的使用經驗 -开发者知识库,第1张

一、 Gradle配置

在project的gradle腳本內插入插件依賴:

buildscript {
repositories {
jcenter()
}

dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
// Add plugin
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}

}

在module的gradle插件中引入插件
首先引入apt插件(Dagger2的原理是在編譯時注入代碼)

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

然后在dependencies里面添加依賴,現在的最新版本是2.0.2

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'

compile 'com.google.dagger:dagger:2.0.2'
apt 'com.google.dagger:dagger-compiler:2.0.2'
compile 'org.glassfish:javax.annotation:10.0-b28'
}

最后一個依賴是javax注解的依賴,標准版本的JDK 1.7以上版本是直接有這個庫的,但是Google在一開始就只提供了有限的javax的支持(Oracle的API版權)。

二、基本概念

理解Dagger2在一開始是很難的,首先你得需要理解依賴注入的概念和為什么需要依賴注入。如果你還不是很理解也沒關系,接下來的這個例子會幫助你理解。

@Inject(注入):使用這個注解是告訴Dagger當前申明的類或者屬性需要被注入,Dagger會根據配置來提供它的一個實例。
@Module(模塊):它申明Dagger在哪里可以找到依賴,可以把多個Module合並到一塊向Component提供依賴。
@Provide(提供):這個注解在@Module里使用,定義申明的方法告訴Dagger我們是如何構造並提供Module申明的實例的。
@Component(組件):它是連接Inject和Module的容器,我們將寫好的Module放入組件中,並且通過他向申明了Inject的類或者屬性提供注入。
@Scope(作用域):它的作用是申明Dagger的實例的生命周期,接下來的例子會用到它。
@Qualifier(作用范圍):

三、使用實例

Step 1:
申明一個組件

/**
* Created by Hubert on 15/12/9.
*/

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {

void inject(BaseActivity baseActivity);

Context context();

Preference preference();
}

我們用了一個@Singleton注解申明它為單例的,Preference是我自己定義個一個類,用來保存用戶偏好。

/**
* Created by Hubert on 15/12/9.
*/

public class Preference {

private String name;

private boolean enableSSL;

public boolean isEnableSSL() {
return enableSSL;
}

public void setEnableSSL(boolean enableSSL) {
this.enableSSL = enableSSL;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

Step 2:
申明一個模塊

/**
* Created by Hubert on 15/12/9.
*/

@Module
public class AppModule {

private final DemoApplication application;

private final Preference preference;

public AppModule(DemoApplication application, Preference preference) {
this.application = application;
this.preference = preference;
}

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

@Provides
@Singleton
Preference providePreference() {
return preference;
}
}

這個模塊申明將由它提供Preference,而Preference則在它的構造函數中傳入。

Step 3:
為了解釋程序的后面部分有必要給大家講一下我們團隊采用的項目MVP結構。
首先所有的Activity都會繼承一個BaseActivity

/**
* Created by Hubert on 15/12/9.
*/

public abstract class BaseActivity<T extends Presenter> extends AppCompatActivity {

private T mPresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = newPresenter();
}

/**
* Provide your own presenter for this activity.
*
* @return Presenter of specific activity.
*/

protected abstract T newPresenter();

protected T getPresenter() {
return mPresenter;
}

}

大家只需要理解到newPresenter方法會在onCreate的時候調用就足夠理解后面的內容了。

Step 4:
上面的AppComponent提供了一個全局的組件,下面我們將為某一個Activity提供一個組件:

/**
* Created by Hubert on 15/12/9.
*/

@PerActivity
@Component(dependencies = AppComponent.class, modules = {MainActivityModule.class})
public interface MainActivityComponent {

void inject(MainActivity mainActivity);

}

Dagger 2是支持Component的復用的,MainActivityComponent依賴於AppComponent,它會為MainActivityComponent提供Preference,后面會涉及到。

/**
* Created by Hubert on 15/12/9.
*/

@Module
public class MainActivityModule {

private final MainActivityViewer mViewer;

public MainActivityModule(MainActivityViewer viewer) {
this.mViewer = viewer;
}

@Provides
@PerActivity
MainActivityPresenter provideMainActivityPresenter(Preference preference) {
return new MainActivityPresenter(mViewer, preference);
}

}

MainActivityModule提供了MainActivityPresenter,他提供的方法里面會有一個Preference的參數,這個參數將會由Dagger自動注入,有興趣的人可以去看看Dagger生成的源碼。

/**
* Created by Hubert on 15/12/9.
*/

public class MainActivityPresenter extends Presenter<MainActivityViewer> {

private Preference mPreference;

public MainActivityPresenter(MainActivityViewer viewer, Preference preference) {
super(viewer);
mPreference = preference;
}


public void showPreference() {
getViewer().showToastMessage(mPreference.toString());
}
}

MainActivityPresenter提供了showPreference()方法,它將調用Viewer接口的showToastMessage。

Step 5:
這里面所有的東西都在MainActivity中全部整合起來。
MainActivity中實現了newPresenter方法

    @Inject
MainActivityPresenter presenter;

@Override
protected MainActivityPresenter newPresenter() {
DaggerMainActivityComponent.builder()
.appComponent(DemoApplication.getInstance().getAppComponent())
.mainActivityModule(new MainActivityModule(this))
.build().inject(this);
return presenter;
}

DaggerMainActivityComponent是一開始不存在的,當寫完了MainActivityComponent后點擊編譯就會生成。
通過以上調用presenter就被注入了。

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复