2024年Dagger2 基础入门与使用(1),2024年最新android面试大全

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

User getuser();

void inject(MainActivity activity);

}

注意 自定义的@Singleton、@ActivityScope注解根本就没有这些功能,它的作用仅仅是“标记”,没有生成任何文件,只是多了一个DoubleCheck来进行单例的生成!

DaggerMianComponent.java

private void initialize(final Builder builder) {

this.providerUserProvider =

DoubleCheck.provider(UserModule_ProviderUserFactory.create(builder.userModule));

this.providerUserProvider2 =

DoubleCheck.provider(DataInfoModule_ProviderUserFactory.create(builder.dataInfoModule));

}

DoubleCheck.java 生成对应的单例的对象

public final class DoubleCheck implements Provider, Lazy {

private static final Object UNINITIALIZED = new Object();

private volatile Provider provider;

private volatile Object instance = UNINITIALIZED;

private DoubleCheck(Provider provider) {

assert provider != null;

this.provider = provider;

}

@SuppressWarnings(“unchecked”) // cast only happens when result comes from the provider

@Override

public T get() {

Object result = instance;

if (result == UNINITIALIZED) {

synchronized (this) {

result = instance;

if (result == UNINITIALIZED) {

result = provider.get();

Object currentInstance = instance;

if (currentInstance != UNINITIALIZED && currentInstance != result) {

throw new IllegalStateException("Scoped provider was invoked recursively returning "

  • "different results: " + currentInstance + " & " + result + ". This is likely "

  • “due to a circular dependency.”);

}

instance = result;

provider = null;

}

}

}

return (T) result;

}

/** Returns a {@link Provider} that caches the value from the given delegate provider. */

public static Provider provider(Provider delegate) {

checkNotNull(delegate);

if (delegate instanceof DoubleCheck) {

return delegate;

}

return new DoubleCheck(delegate);

}

/** Returns a {@link Lazy} that caches the value from the given provider. */

public static Lazy lazy(Provider provider) {

if (provider instanceof Lazy) {

@SuppressWarnings(“unchecked”)

final Lazy lazy = (Lazy) provider;

return lazy;

}

return new DoubleCheck(checkNotNull(provider));

}

}

如果上面单例 @Singleton没有保持一致就会报错,错误由于下个节点

DataInfoModule 中使用了@Singleton而 UserModule和MianComponent没有使用时报出的错误

.MianComponent (unscoped) may not reference scoped bindings:

@Component(modules ={UserModule.class})

^

@Provides @Singleton com.lhw.daggerdemo.bean.DataInfo com.lhw.daggerdemo.module.DataInfoModule.providerUser()

注解@Module中的includes和@Component中的modules的使用

User.java 添加多个构造函数,添加 DataInfo对象

public class User {

private DataInfo mDataInfo;

public String name;

public int age;

public String tag;

@Inject

public User() {

}

public User(DataInfo data, String tagName) {

tag = tagName;

mDataInfo = data;

}

public User(String tagName) {

tag = tagName;

}

public User(DataInfo dataInof) {

mDataInfo = dataInof;

}

DataInfo.java

public class DataInfo {

@Inject

public DataInfo(){}

public String sex;

public int height;

@Override

public String toString() {

return “DataInfo{” +

“sex='” + sex + ‘’’ +

“, height=” + height +

‘}’;

}

}

DataInfoModule.java

@Module

public class DataInfoModule {

@Provides

@Singleton

DataInfo providerUser(){

return new DataInfo();

}

}

像上面那种情况我们可以有两种处理方式

  • 通过includes 引入到UserMoudle中

@Module(includes = {DataInfoModule.class}) //includes 引入moudle

public class UserModule {

@Provides @Singleton

User providerUser(){

return new User();

}

}

@Singleton

@Component(modules ={UserModule.class})

public interface MianComponent {

void inject(MainActivity activity);

}

  • 通过在MianComponent modules 引入 UserMoudle和 DataInfoModule

@Singleton

@Component(modules ={UserModule.class, DataInfoModule.class})//加载多个Moudle

public interface MianComponent {

void inject(MainActivity activity);

}

注解@Named的使用

相当于用来区分多个实体类的别名两个构造函数

@Qualifier

@Documented

@Retention(RUNTIME)

public @interface Named {

/** The name. */

String value() default “”;

}

给UserModule中User不同的构造添加Named

@Module(includes = {DataInfoModule.class}) //includes 引入moudle

public class UserModule {

@Provides @Singleton

User providerUser(){

return new User();

}

@Named(“userN”)

@Provides @Singleton

User providerUserN(){

return new User(“userN”);

}

@Named(“userY”)

@Provides @Singleton

User providerUserY(DataInfo data){

return new User(data,“userY”);

}

}

然后我们调用的时候也做标识区分

public class MainActivity extends AppCompatActivity {

private final static String TAG=“Dagger”;

@Inject

DataInfo dataInfo;

@Named(“userY”)

@Inject

User userY;//使用Inject 注解获取实例化对象User

@Named(“userN”)

@Inject

User userN;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//依赖绑定

DaggerMianComponent.create().inject(this);

userY.name=“塞班”;

userY.age=18;

userN.name=“阿巴阿巴”;

userN.age=10;

dataInfo.height=188;

dataInfo.sex=“nice”;

//对象调用

Log.d(TAG,“userY=”+userY+“,tag=”+userY.tag+“,DataInfo=”+dataInfo);

Log.d(TAG,“userN=”+userN+“,tag=”+userN.tag);

}

}

注解@Qualifier的使用

和@Named的作用类似,都是用来区分类型,可以自定义类型,只能是基本数据类型、String、Enum、Class,包含其一维数组

//Qualifier.java

@Target(ANNOTATION_TYPE)

@Retention(RUNTIME)

@Documented

public @interface Qualifier {}

//自定义QualifierType.java

@Qualifier

@Retention(RetentionPolicy.RUNTIME)

public @interface QualifierType {

String value() default “”;

String value2() default “”;

}

//UserModule.java中使用

@QualifierType (“vip”)//默认的value一个属性

@QualifierType (value2 = “nomal”)//value2一个属性

@QualifierType (value = “svip”, value2 = “vip”)//使用了两个属性

其他情况的应用

1.方法注入的应用:

此时@Sign不能注解在方法上,必须注解在对应的注入参数中。

@Inject

public void injectUser(@QualifierType(“vip”) User user) {

mUser= user;

}

2.@Provides方法依赖关系的应用:

@QualifierType(“svip”)

@Provides

public Bus provideUserVipType(@QualifierType(“vip”) String nameType) {

return new User(nameType);

}

@QualifierType(“vip”)

@Provides

public String provideNameType() {

return “高级唯爱皮”;

}

注意 build构建对象的两种方式

这里就算我们不使用 @Inject 注入User对象,也能通过Moudle中@Provides提供的User对象,注入Component 的 mianComponent生成创建的工厂类 DaggerMianComponent 获取对应的对象

MianComponent.java 添加getUser获取Moudle中的User对象

@Singleton

@Component(modules ={UserModule.class})

public interface MianComponent {

User getuser();

void inject(MainActivity activity);

@Component.Builder

interface Builder{

@BindsInstance

Builder appplication(Application application);

MianComponent build();

}

}

MainActivity.java 两种实例化获取方式

//1.Inject 注入方式的

@Inject

User user

DaggerMianComponent.builder().build().inject(this);

//2.不使用Inject 注入方式的

MianComponent mianComponent = DaggerMianComponent.builder().build();

User user=mianComponent.getUser();

Android Studio Make Build 生成 DaggerMianComponent

public final class DaggerMianComponent implements MianComponent {

private Provider providerUserProvider;

private Provider providerUserProvider2;

private Provider providerUserYProvider;

private Provider providerUserNProvider;

private MembersInjector mainActivityMembersInjector;

private DaggerMianComponent(Builder builder) {

assert builder != null;

initialize(builder);

}

public static MianComponent.Builder builder() {

return new Builder();

}

@SuppressWarnings(“unchecked”)

private void initialize(final Builder builder) {

this.providerUserProvider =

文末

架构师不是天生的,是在项目中磨练起来的,所以,我们学了技术就需要结合项目进行实战训练,那么在Android里面最常用的架构无外乎 MVC,MVP,MVVM,但是这些思想如果和模块化,层次化,组件化混和在一起,那就不是一件那么简单的事了,我们需要一个真正身经百战的架构师才能讲解透彻其中蕴含的深理。

移动架构师

系统学习技术大纲

一线互联网Android面试题总结含详解(初级到高级专题)

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

onent(Builder builder) {

assert builder != null;

initialize(builder);

}

public static MianComponent.Builder builder() {

return new Builder();

}

@SuppressWarnings(“unchecked”)

private void initialize(final Builder builder) {

this.providerUserProvider =

文末

架构师不是天生的,是在项目中磨练起来的,所以,我们学了技术就需要结合项目进行实战训练,那么在Android里面最常用的架构无外乎 MVC,MVP,MVVM,但是这些思想如果和模块化,层次化,组件化混和在一起,那就不是一件那么简单的事了,我们需要一个真正身经百战的架构师才能讲解透彻其中蕴含的深理。

[外链图片转存中…(img-cwFU8X3v-1715689105699)]

[外链图片转存中…(img-TiMOUjXk-1715689105699)]

一线互联网Android面试题总结含详解(初级到高级专题)

[外链图片转存中…(img-diUCDUOF-1715689105700)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值