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对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)