原文来自:http://www.jianshu.com/p/39d1df6c877d
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);
// 执行注入. 编译后, MainComponent 就会变成 DaggerMainComponent, 使用 Builder 模式实例化一个 Component, 然后执行了 inject.
// 执行注入的是在这里, 所以 MainPresenter 实例化在这里, 如果没有执行这里就使用, 抛出 null 的.
DaggerMainComponent.builder()
// MainPresenter 中的 view 参数就是从这里来的. 这个 this 传过去的.
// 在这里, MainComponent 中需要的 Module, 在这里生成实例化.
.mainModule(new MainModule(this))
.build()
// this 参数传递 MainActivity 给 inject 方法. 表明要注入到 MainActivity 中, 而不是 view 的实例.
//MainPresenter 的构造方法是从 MainModule 中获取获取 view 参数的.
.inject(this);
//调用Presenter方法加载数据
mainPresenter.loadData();
}
}
public class MainPresenter {
//MainContract是个接口,View是他的内部接口,这里看做View接口即可
private MainContract.View mView;
// 要注入到其他类中. 但是这个 view 参数怎么来的呢 ? 就会在 Module 里寻找,
@Inject
MainPresenter(MainContract.View view) {
mView = view;
}
public void loadData() {
//调用model层方法,加载数据
...
//回调方法成功时
mView.updateUI();
}
// 提供实例. 即提供 presenter 所需要的 view.
// 构造方法需要的参数由这里提供.
@Module
public class MainModule {
// 构造函数的
private final MainContract.View mView;
public MainModule(MainContract.View view) {
mView = view;
}
// 依赖靠这里提供. 当需要 MainView 的时候回自动调用的.
@Provides
MainView provideMainView() {
return mView;
}
}
// 这是桥梁. 本身不提供实例. 当注入的实例需要参数怎么办 ? 从 Module 里寻找. 或者从 标注有
// 注意了, component 只会实例化需要注入的类实例. 但是类实例需要参数, 怎么办 ? 那就从 Module 里寻找, 所以为什么需要 Module.
// 因为依赖到 MainModule, 所以要写 module. 但为什么 需要 module 呢, 因为 presenter 在实例化的时候需要一个参数. 即 View 参数.
// Module 提供 view 参数.
@Component(modules = MainModule.class)
public interface MainComponent {
void inject(MainActivity activity);
}
另外还发现了经典的文章, 一个系列六篇, 看了会更明白 :
http://blog.csdn.net/u010961631/article/details/72625565