Android--Dagger2入门

Android--Dagger2入门,第1张

dagger拥有两种方式注入对象,一种是利用 @Inject注解 构造函数

在moudle的gradle中做如下配置,我在2301版本中尝试使用构造函数注入,发现怎么编译都会报错,结果最后使用最新版本就可以了:

这边定义两个类,分别代表本地和远程的数据源,并对构造函数使用@Inject注解

定义包装类DataSource,包含上面两个类,同样对构造函数使用@Inject注解

对于需要注入的对象,dagger并不是直接注入,而是需要一个中间件去注入他们,使用代理模式的思想,这样的好处是方便管理和控制

build下项目后,dagger会对应生成一个DaggerApplicationComponent类,通过上篇文章,我们知道用的是APT技术

调用生成类DaggerApplicationComponent的注入方法

运行后日志:

2021-12-04 /comarubadaggerapplication I/aruba_log: DataSource(remoteDataSource=comarubadaggerapplicationdidatasourceRemoteDataSource@1ae5a6b, localDataSource=comarubadaggerapplicationdidatasourceLocalDataSource@8b49c8)

可以看到dagger帮我们自动生成注入对象了,并且我们在使用的地方不需要关注它是如何生成的

第二种方式就是模块注入,构造函数注入是以类为对象,模块注入则是以方法为对象

接下来尝试使用网络请求,以获取百度的首页HTML

别忘了在Manifestxml中添加权限

效果:

模块注入同样也实现了自动注入对象,并且这种方式可读性和可维护性更高

通过上面两种方式,我们知道了如何注入对象,但是我们并不知道注入的对象的生命周期,有时我们希望获取的对象是一个单例,这种情况仅仅使用注入是无法实现的

下面例子,通过注入两个相同类型对象,查看它们是否是同一份实例

在MainActivity中同时注入两个DataSource对象,并通过打印日志,观测结果

日志打印:

2021-12-04/comarubadaggerapplication I/aruba_log: DataSource(remoteDataSource=comarubadaggerapplicationdidatasourceRemoteDataSource@137fdbe, localDataSource=comarubadaggerapplicationdidatasourceLocalDataSource@31b1e1f)

2021-12-04/comarubadaggerapplication I/aruba_log: DataSource(remoteDataSource=comarubadaggerapplicationdidatasourceRemoteDataSource@b3756c, localDataSource=comarubadaggerapplicationdidatasourceLocalDataSource@7b81735)

2021-12-04/comarubadaggerapplication I/aruba_log: false

结果显示这两个对象不是同一个实例

在使用构造注入或Module注入时,一旦使用了作用域注解,其Component也要使用相同的作用域注解,否则编译会报错。同一个Component实例在注入对象时,一旦发现注入方式使用了作用域,那么它们注入的对象将会是同一份实例

@Singleton注解为dagger默认提供的一个作用域注解。定义一个构造函数注入方式,并使用该注解

在Component中,使用相同作用域,并且我重新定义了一个ScopeActivity来测试结果

ScopeActivity中需要注入两个SingletonTest 对象,并打印是否为同一个实例

日志结果:

2021-12-04/comarubadaggerapplication I/aruba_log: singleton1 hashcode: 246939604

2021-12-04/comarubadaggerapplication I/aruba_log: singleton2 hashcode: 246939604

结果显示,这两个对象是同一份实例

将上面的作用域注解替换成MyScope

日志结果:

2021-12-04/comarubadaggerapplication I/aruba_log: singleton1 hashcode: 246939604

2021-12-04/comarubadaggerapplication I/aruba_log: singleton2 hashcode: 246939604

和使用@Singleton是相同的效果

模块注入方式,使用作用域注解在方法上:

即使用了同一个作用域,不同的Component实例进行注入,最后生成的对象还是不同的实例,即作用域管理的生命周期是跟随Component的。但一般情况下,我们一个APP只需要一份Component实例,而一个App中,往往有着不同的作用域

在MainActivity中,也定义注入一个SingleTest对象,注意每调用一次DaggerApplicationComponentcreate(),会创新一个新的DaggerApplicationComponent对象

跳转到ScopeActivity后,我查看下打印结果:

2021-12-04/comarubadaggerapplication I/aruba_log: MainActivity singleton hashcode: 20446654

2021-12-04/comarubadaggerapplication I/aruba_log: singleton1 hashcode: 127836367

2021-12-04/comarubadaggerapplication I/aruba_log: singleton2 hashcode: 127836367

MainActivity和ScopeActivity中都调用了Component的create方法,所以两份Component实例注入的对象是不同的实例

如果想要一个Component下使用不同的作用域,Component是不支持的,但Subcomponent可以使用, Subcomponent又可以被添加到Component中

同时在子组件中提供注入方法,这边我新建了一个SubActivity

在Moudle注解中,指定使用哪个子组件

MainActivity中注入打印,并跳转到SubActivity

SubActivity中创建子组件,并注入

日志结果:

2021-12-04/comarubadaggerapplication I/aruba_log: MainActivity singleton hashcode: 257322958

2021-12-04/comarubadaggerapplication I/aruba_log: SubActivity singleton hashcode: 257322958

2021-12-04/comarubadaggerapplication I/aruba_log: SubActivity subObject1 hashcode: 219854405

2021-12-04/comarubadaggerapplication I/aruba_log: SubActivity subObject2 hashcode: 219854405

前两条证实了同一个父Component实例,就算使用子组件注入,作用域也有作用,后面两条说明我们成功的注入了子组件生成的对象

最后,附上一张dagger的结构图:

方法一

final View view = LayoutInflaterfrom(context)inflate(Rlayouttest, null);

方法二

LayoutInflater li = (LayoutInflater) contextgetSystemService(ContextLAYOUT_INFLATER_SERVICE);

View view = liinflate(Rlayouttest,null);

我的testxml文件中有一个

<RelativeLayout android:id="@+id/cc_container"

android:layout_width="fill_parent" android:layout_height="wrap_content">

我想在cc_container中加入一个view

这个问题应该算是Java的基础吧,在别的地方这是个可见性的问题。同一个类中:

class Test{

    Handle h;

    public Test(){

        h = new Handler();

    }

}

全局变量,在Test中都是可用的。

不同的类中,Android中自带一个Application全局变量:

class MyApplication extends Application{

    public Handler h;

    

}

//然后在你创建的地方将这个handler赋值给application中的

((MyApplication)getApplication())h = thish;

//于是你可以再其他地方拿到这个handler了

((MyApplication)getApplication())hsendxxxx

当然了,你可能在《app研发录》中看到过不要把奇奇怪怪的东西放到Application中这个说法,我也同意,不过你可以将handler传过去,咋传根据你的需求来,大概的思路就跟Application里差不多,拿到一个对象调用public方法设置Handler。

1、找到目录的main先建立assets格式的文件夹。

2、再把需要读取的txt文件放入到该文件夹下。

3、在利用代码lnputStreaminputStream=getAssets()open(“txt文件的名称”),就可以获取到输出对象的内容了。

4、以上就是androidstudio怎么在获取对象后输出对象内容的步骤了。

以上就是关于Android--Dagger2入门全部的内容,包括:Android--Dagger2入门、如何在非Activity中获得RelativeLayout对象、android 创建了handle 在别的地方怎么获取到handle对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9756005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存