标签:cts on() toast 内容 void display depend 数据结构 快速
compile ‘com.google.dagger:dagger:2.11‘//2017-9-17最新版本为【2.11】
annotationProcessor ‘com.google.dagger:dagger-compiler:2.11‘//dagger-compiler为编译时期生成代码等相关的类库
evolution [??v??lu??n, ?iv?-] n. 演变; 进化; 发展;
approach [??pro?t?] vt.接近,走近,靠近; vt.接近; 着手处理; 使移近; n. 方法; 途径; 接近;
in favor of 赞成[支持](某人或某事物); 以…取代; (支票) 以某人[某部门]为受款人;
dependencies {
classpath ‘com.android.tools.build:gradle:2.3.1‘//每个Android项目默认都会带的
//PS:在新版本中千万不要加这些,日了狗了,加上去之后反而不会生成DaggerXXXComponent。
classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.4‘//这个是需要我们手动添加的,apt是用于自动生成代码来进行依赖注入的
}
apply plugin: ‘com.android.application‘//每个Android项目默认都会带的。在build.gradle的第一行
//PS:在新版本中千万不要加这些,日了狗了,加上去之后反而不会生成DaggerXXXComponent。
apply plugin: ‘com.neenbedankt.android-apt‘//apt支持
compile ‘com.google.dagger:dagger:2.x‘
annotationProcessor ‘com.google.dagger:dagger-compiler:2.x‘//dagger-compiler为编译时期生成代码等相关的类库
compile ‘com.google.dagger:dagger-android:2.x‘
compile ‘com.google.dagger:dagger-android-support:2.x‘ // if you use the support libraries
annotationProcessor ‘com.google.dagger:dagger-android-processor:2.x‘
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xmaxerrs" << "500" // or whatever number you want
}
}
@Module//作为实例对象的容器
public class MainModule {
String name;
public MainModule(String name) {
this.name = name;
}
@Provides//标注能够提供实例化对象的方法。方法名字可以随意,但建议以provider开头
Person providerPerson() {//先判断Module中是否有提供该对象实例化的方法(根据返回值类型及@Provides注解来判断),如果有则返回
return new Person(name);//如果没有,则查找该类的构造方法,是否有带有@Inject的构造方法。如果存在,则使用此构造方法创建对象后返回
//如果都没有,则无法为使用者注入该对象的实例
}
}
@Component(modules = MainModule.class) //作为桥梁,沟通调用者和依赖对象库
public interface MainComponent {
void inject(MainActivity activity);//定义注入的方法。方法名随意,但建议以inject开头
}
public class MainActivity extends AppCompatActivity {
@Inject Person person;//标注需要注入的对象
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerMainComponent.builder().mainModule(new MainModule("白乾涛")).build().inject(this);
Log.i("bqt", person.name);//包青天。如果去掉providerPerson上的【@Provides】注解,则会调用Person具有@Inject的构造方法
}
}
public class Person {
public String name;
@Inject
public Person() {
name = "默认的名字";
}
public Person(String name) {
this.name = name;
}
}
public interface IMainView {
void showToast(String src);
}
public class MainActivity extends AppCompatActivity implements IMainView {
@Inject IMainPresenter mainPresenter;//注意:如果是通过Module中@Provides注解标注的方法来生成对象,这里可以声明为IMainPresenter
// 否则,必须声明为MainPresenter,因为此时框架是去查MainPresenter中使用@Inject标注的构造方法,而不是接口中的***
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainComponent.builder()
.mainModule(new MainModule(this, "白乾涛"))
.build()
.inject(this);
mainPresenter.login("123");
}
@Override
public void showToast(String src) {
Toast.makeText(this, src, Toast.LENGTH_SHORT).show();
}
}
public interface IMainPresenter {
void login(String password);
}
public class MainPresenter implements IMainPresenter {
private IMainView mainView;
private String name;
@Inject MainModel mainModel;//注意:如果是通过Module中@Provides注解标注的方法来生成对象,这里可以声明为IMainModel
// 否则,必须声明为MainModel,因为此时框架是去查MainModel中使用@Inject标注的构造方法,而不是接口中的***
public MainPresenter(IMainView mainView, String name) {
this.mainView = mainView;
this.name = name;
Log.i("bqt", "【构造MainPresenter】");
DaggerMainModelComponent.builder()
.mainModelModule(new MainModelModule())
.build()
.inject(this);
}
@Override
public void login(String password) {
String info = mainModel.login(name, password);
if (mainView != null) mainView.showToast(info);
Log.i("bqt", info);
}
}
@Module
public class MainModule {
private IMainView mainView;
private String name;
public MainModule(IMainView mainView, String name) {
this.mainView = mainView;
this.name = name;
Log.i("bqt", "【构造MainModule】");
}
@Provides
IMainPresenter provideMainPresenter() {
return new MainPresenter(mainView, name);
}
}
@Component(modules = MainModule.class)
public interface MainComponent {
void inject(MainActivity activity);//这里必须指定要注入到哪个类里面,参数声明必须是MainActivity而不能是IMainView
}
//*******************************************以下是MVP中M相关的类***********************************************
interface IMainModel {//在这个案例中,抽象出的M接口完全没有存在的价值了
String login(String name, String password);
}
class MainModel implements IMainModel {
@Override
public String login(String name, String password) {
return (password == null || password.equals("")) ? "请登录" : "登录成功,你的名字为:" + name;
}
@Inject
public MainModel() {
Log.i("bqt", "【构造MainModel】");
}
}
@Component(modules = MainModelModule.class)
interface MainModelComponent {
void inject(MainPresenter mainPresenter);
}
@Module
class MainModelModule {
}
标签:cts on() toast 内容 void display depend 数据结构 快速
原文地址:http://www.cnblogs.com/baiqiantao/p/7538511.html