刚开始学Dagger2我是拒绝的,我就是想用想成的代码,不要任何特效~DuangDuangDuang~
第一次接触dagger2这样的依赖注入框架,第一次看就放弃了,主要是我接手的是别人写好项目,项目不大bug不少,如果修改使用dagger2完全本末倒置了。
dagger2网上教程很多,很详细,我这里是非常非常简单,不是小白可以xx掉了。说实话接触类似框架,很多DuangDuang给我贴上那么多代码,脑袋疼,也完全不明白这样有啥用。
添加最新的Android studio直接添加这个就可以,添加多了会报错。低级的百度一大堆,呵呵~
compile 'com.google.dagger:dagger:2.5' annotationProcessor 'com.google.dagger:dagger-compiler:2.5'
dagger2我看着第一个作用就是不用new对象了。对就是不用new对象了。
public class TestA1 {
String name;
@Inject
public TestA1(){
name=“啊啊啊啊”;
}
}
public class MainActivity extends AppCompatActivity {
@Inject
TestA1 testA1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainComponent.builder().build().in(this);
Toast.makeText(this,testA1.name,Toast.LENGTH_SHORT).show();
}}
在构造函数上直接添加@Inject在调用的类也加上@Inject,不用new直接用,如果你直接复制我的代码会发现DaggerMainComponent.builder().build().in(this);报错,恩报错就对了,网上很多代码就是直贴一部分。
因为还要建一个接口才行。建完之后chrl+b rebuild一下项目会自动给你建一个DaggerMainComponent
@Component
public interface MainComponent{
void in(MainActivity mainActivity);
}
为啥要这样,搞到这里完全没看出什么简单快捷好用....然后就放弃这个了。
升级2:我们现在只是最简单的一个new对象,大家先知道怎么用,然后我们升级一下,改一下代码new一个开发中可以用到的例子同时出现一个新的注解Module
public class TestA1 {
String name;
Tint tint;
@Injectpublic TestA1( Tint tint){
name="啊啊啊啊";
this.tint=tint;
public void getDate(){
//项目中可以访问网络,数据库等
tint.UpdateUI(name);
}
//回调接口
void UpdateUI(String name);
}
}
public class MainActivity extends AppCompatActivity implements TestA1.Tint,View.OnClickListener{
Button button;
@Inject
TestA1 testA1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=findViewById(R.id.button);
button.setOnClickListener(this);
DaggerMainComponent.builder().mainModule(new MainModule(this)).build().in(this);
Toast.makeText(this,testA1.name,Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
testA1.getDato();
break;
}
}
//更新要变化的控件
@Override
public void UpdateUI(String name) {
Toast.makeText(this,"啦啦啦",Toast.LENGTH_SHORT).show();
}
}
@Module
public class MainModule {
TestA1.Tint tint;
public MainModule(TestA1.Tint tint){
this.tint=tint;
}
@Provides
public TestA1.Tint getTint(){
return tint;
}
}
@Component(modules = MainModule.class)
public interface MainComponent{
void in(MainActivity mainActivity);
}
这个代码主要是实现了一个回调,多了一个@Module 标示的类,和@Provides标志的方法,可以认为module会提供一些动态的对象,provides是获取对象的方法.(modules = MainModule.class)在Component类要关联上我mainactivity上要关联这个module可以关联多个module,module可以继承。调用module的地方是DaggerMainComponent.builder().mainModule(new MainModule(this)).build().in(this);红字标示部分,mainModule这个方法名也是自动生成的,参数是this是因为MainActivity 实现了tint接口,很多人也喜欢使用内部类来实现,原理一样。这样在TestA1 的构造中就会直接关联上,可以认为这是个简单的mvp实现。可以自己写一下,我一直认为东西看事学不会的,照着别的敲两遍就会了。
升级3:实现recyclerView的adapter
public class Order_adapter extends Adapter<Order_adapter.orderViewHolder> {
Activity activity;
List<String> stringList;
@Inject
public Order_adapter(Activity activity,List<String> stringList){
this.activity=activity;
this.stringList=stringList;
}
@Override
public orderViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
orderViewHolder holder =new orderViewHolder(LayoutInflater.from(
activity).inflate(R.layout.item_holder, parent,
false));
return holder;
}
@Override
public void onBindViewHolder(orderViewHolder holder, int position) {
holder.textView.setText(stringList.get(position));
}
@Override
public int getItemCount() {
return stringList.size();
}
class orderViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public orderViewHolder(View itemView) {
super(itemView);
textView=itemView.findViewById(R.id.textv);
}
}
}
@Module
public class MainModule {
TestA1.Tint tint;
List<String> stringList;
Activity activity;
public MainModule(TestA1.Tint tint,Activity activity){
this.stringList=new ArrayList<>();
this.activity=activity;
this.tint=tint;
}
@Provides
public TestA1.Tint getTint(){
return tint;
}
@Provides
public List<String> getStringList(){
for (int i=0;i<10;i++){
stringList.add(i+"我最帅");
}
return stringList;
}
@Provides
public Activity getActivity() {
return activity;
}
}
@Component(modules = MainModule.class)
public interface MainComponents {
void in(MainActivity mainActivity);
}
public class MainActivity extends AppCompatActivity implements Tint ,View.OnClickListener{
TextView tex;
Button button;
RecyclerView recyclerView;
@Inject
TestA1 testA1;
@Inject
Order_adapter order_adapter;
@Overrideprotected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainComponents.builder().mainModule(new MainModule(this,this)).build().in(this);
tex=findViewById(R.id.textv);
button=findViewById(R.id.button);
recyclerView=findViewById(R.id.recycler);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(order_adapter);
button.setOnClickListener(this);
tex.setOnClickListener(this);
}
@Override
public void UpdateUI() {
Toast.makeText(this,"啦啦啦",Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
testA1.getDato();
break;
}
}
}
这样就是一个简单列表,当开发初期网络数据不稳定有需要把ui和基本功能实现可以直接修改modules 里面的信息,这样突然感觉还是很方便的,如果你是跟着看文章敲到这里的感觉基本上操作你已经差不多了。自己感觉Dagger2和Retrofit+okhttp什么的很相似当刚开始学百度出来的例子发现完全没感觉比现在使用的多简单明了,然后放弃了,其实等你做的东西不是简单的例子是就会发现他们的优势。