引入Dagger2
- 配置apt插件(在build.gradle(Project:xxx)中添加如下代碼)
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
- 添加依賴(在build.gradle(Module:app)中添加如下代碼)
//添加如下代碼彤蔽,應(yīng)用apt插件
apply plugin: 'com.neenbedankt.android-apt'
...
dependencies {
...
compile 'com.google.dagger:dagger:2.4'
apt 'com.google.dagger:dagger-compiler:2.4'
//java注解
compile 'org.glassfish:javax.annotation:10.0-b28'
...
}
使用Dagger2
在mvp中,最常見的一種依賴關(guān)系娄柳,就是Activity持有presenter的引用咙咽,并在Activity中實例化這個presenter,即Activity依賴presenter扮匠,presenter又需要依賴View接口揖曾,從而更新UI尾序。
用依賴注入的方式寫,代碼如下:
public class MainActivity extends AppCompatActivity implements MainContract.View {
@Inject
MainPresenter mainPresenter;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainComponent.builder()
.mainModule(new MainModule(this))
.build()
.inject(this); //調(diào)用Presenter方法加載數(shù)據(jù)
mainPresenter.loadData();
...
}
}
public class MainPresenter {
//MainContract是個接口迷郑,View是他的內(nèi)部接口枝恋,這里看做View接口即可
private MainContract.View mView;
@Inject
MainPresenter(MainContract.View view) {
mView = view;
}
public void loadData() {
//調(diào)用model層方法,加載數(shù)據(jù)
//...
// 回調(diào)方法成功時
mView.updateUI();
}
@Module
public class MainModule {
private final MainContract.View mView;
public MainModule(MainContract.View view) {
mView = view;
}
@Provides
MainView provideMainView() {
return mView;
}
}
@Component(modules = MainModule.class)
public interface MainComponent {
void inject(MainActivity activity);
}
我們先看MainActivity里的代碼嗡害,之前是直接聲明MainPresenter焚碌,現(xiàn)在在聲明的基礎(chǔ)上加了一個注解@Inject,表明MainPresenter是需要注入到MainActivity中霸妹,即MainActivity依賴于MainPresenter十电,這里要注意的是,使用@Inject時,不能用private修飾符修飾類的成員屬性鹃骂。
然后我們在MainPresenter的構(gòu)造函數(shù)上同樣加了@Inject注解台盯。這樣MainActivity里的mainPresenter與他的構(gòu)造函數(shù)建立了某種聯(lián)系。這種聯(lián)系我們可以這樣理解畏线,當看到某個類被@Inject標記時静盅,就會到他的構(gòu)造方法中,如果這個構(gòu)造方法也被@Inject標記的話寝殴,就會自動初始化這個類蒿叠,從而完成依賴注入。
然后杯矩,他們之間并不會憑空建立起聯(lián)系栈虚,因此我們想到,肯定需要一個橋梁史隆,將他們連接起來,也就是下面要介紹的Component曼验。