Dragger 2遇到的坑 Dragger2详解 Dragger2学习最好的资料
我是曹新雨,我为自己代言。现在的菜鸟,3年以后我就是大神。为自己加油。微信:aycaoxinyu
Dragger2是什么,我就不再说了。资料一堆,而且里面的注解什么意思,我推荐两篇文章,这两篇都是我精挑细选,一般的文章我是不推荐的。
http://android.jobbole.com/82694/
http://android.jobbole.com/82704/
http://android.jobbole.com/82705/
有了基础的了解,来跟我helloworld吧。
第一步:配置依赖:
//如果你用了butterknife,那么这个com.neenbedankt.gradle.plugins就不用再次引入了
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
apt 'com.google.dagger:dagger-compiler:2.0'
compile 'com.google.dagger:dagger:2.0' // dagger2
// compile 'com.google.dagger:dagger-compiler:2.0.2' // dagger2
provided 'org.glassfish:javax.annotation:10.0-b28'
}
第二步:
走到这步我就遇到了一个坑,DaggerApplicationComponent这个类一直报找不到。
后来才知道,要rebuild一下,因为这个类是自动生成的。
解决了这个,然后跟着别人写代码,才算是入了点门。直到了写一个类的依赖注入,需要写三个东西:
loginComponent
LoginModel
额,是两个就行了。就像:
AppComponent
AppModule
这两个全局的。
然后怎么依赖给它的,我还没弄懂。遇到了三个错误:
Error:(6, 43) 错误: 找不到符号
符号: 类 DaggerAppComponent
位置: 程序包 com.chinaCEB.cebActivity.components
Error:(19, 10) 错误: com.chinaCEB.cebActivity.view.ILoginActivity cannot be provided without an @Provides-annotated method.
com.chinaCEB.cebActivity.view.LoginActivity.loginPresenter
[injected field of type: com.chinaCEB.cebActivity.presenter.LoginPresenter loginPresenter]
com.chinaCEB.cebActivity.presenter.LoginPresenter.<init>(com.chinaCEB.cebActivity.view.ILoginActivity loginActivity)
[parameter: com.chinaCEB.cebActivity.view.ILoginActivity loginActivity]
每当我不懂dragger2的时候,就看一边资料。这样,真的很有帮助。
http://www.jianshu.com/p/c2feb21064bb
AppComponent: 生命周期跟Application一样的组件。可注入到自定义的Application类中,@Singletion代表各个注入对象为单例。
//component都是接口,到时候,dragger2会生成你的实现类。
//就像DaggerAppComponent 你写了AppComponent就会有DaggerAppComponent这个实现类
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
Context context(); // 提供Applicaiton的Context
ThreadExecutor threadExecutor(); // 线程池
ApiService apiService(); // 所有Api请求的管理类
SpfManager spfManager(); // SharedPreference管理类
DBManager dbManager(); // 数据库管理类
}
AppModule: 这里提供了AppComponent里的需要注入的对象。
//可以发现,AppModule和AppComponent 是对应的
//ThreadExecutor threadExecutor(); // 线程池
/*@Provides
@Singleton
ThreadExecutor provideThreadExecutor(JobExecutor jobExecutor) {
return jobExecutor;
}
*/
@Module
public class AppModule {
private final MyApplication application;
public AppModule(MyApplication application) {
this.application = application;
}
@Provides
@Singleton
Context provideApplicationContext() {
return application;
}
@Provides
@Singleton
ThreadExecutor provideThreadExecutor(JobExecutor jobExecutor) {
return jobExecutor;
}
@Provides
@Singleton
ApiService providesApiService(RetrofitManager retrofitManager) {
return retrofitManager.getService();
}
@Provides
@Singleton
SpfManager provideSpfManager() {
return new SpfManager(application);
}
@Provides
@Singleton
DBManager provideDBManager() {
return new DBManager(application);
}
}
也就是AppComponent里面全都是对象,AppModule是它的实现。可是这些入参都是谁给的?
终于知道activity是怎么得到的了。
@Module
public class ActivityModule {
private final Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
@Provides
@ActivityScope
Activity activity() {
return this.activity;
}
}
然后:
// 建议写在基类Activity里
protect ActivityModule getActivityModule(){
return new ActivityModule(this);
}
搞了一天,终于搞定了。dragger2. 我知道我可以的。哼哼。
我现在知道完整的dragger2步骤了。
引入依赖之后:
第二步:
写AppComponent
package com.chinaCEB.cebActivity.components;
import android.content.Context;
import com.chinaCEB.cebActivity.App;
import com.chinaCEB.cebActivity.modules.AppModule;
import javax.inject.Singleton;
import dagger.Component;
/**
* Created by niuxiaowei on 16/3/19.
*/
//AppModule: 这里提供了AppComponent里的需要注入的对象。
@Singleton
@Component(modules={AppModule.class})
//AppComponent: 生命周期跟Application一样的组件。可注入到自定义的Application类中,@Singletion代表各个注入对象为单例。
public interface AppComponent {
Context getContext();
void inject(App app);
// void inject(BaseActivity baseActivity);
// Test test();
}
只要你按照上面这种方法写的,那么,你的AppComponent 就会被dragger2换一个名字:DaggerAppComponent 。所有的都是。这就是rebuilt的结果。
第三步:
写完了AppComponent,写完了桥,那就该写model了
import android.content.Context;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
/**
* Created by niuxiaowei on 16/3/19.
*/
@Module
public class AppModule {
Context context;
public AppModule(Context context){
this.context = context;
}
@Provides @Singleton
public Context provideContext(){
return context;
}
// @Provides @Singleton
// public Test provideTest(){
// return new Test();
// }
}
然后重复activity 的component ,module
package com.chinaCEB.cebActivity.components;
import com.chinaCEB.cebActivity.modules.ActivityModule;
import com.chinaCEB.cebActivity.scope.PerActivity;
import com.chinaCEB.cebActivity.view.LoginActivity;
import dagger.Component;
/**
*
* Created by niuxiaowei on 16/3/20.
*/
//ActivityComponent,可以看到有个@ActivityScope注解,这个注解是自定义的,对应Activity的生命周期,Dagger2可以通过自定义注解限定注解作用域。
//ActivityComponent:生命周期跟Activity一样的组件,这里提供了inject方法将Activity注入到ActivityComponent中,通过该方法,将Activity中需要注入的对象注入到该Activity中。
@PerActivity
@Component(dependencies = AppComponent.class,modules = {ActivityModule.class})
public interface ActivityComponent {
void inject(LoginActivity loginActivity);
// Activity getActivity();
// void inject(LoginActivity loginActivity);
}
void inject(LoginActivity loginActivity); 必须要写这个去掉不行
activitymodel
package com.chinaCEB.cebActivity.modules;
import android.app.Activity;
import com.chinaCEB.cebActivity.scope.PerActivity;
import com.chinaCEB.cebActivity.view.ILoginActivity;
import com.chinaCEB.cebActivity.view.LoginActivity;
import dagger.Module;
import dagger.Provides;
/**
* 提供baseactivity的module
* Created by niuxiaowei on 16/3/20.
*/
//ActivityModule:注入Activity,同时规定Activity所对应的域是@PerActivity
@Module
public class ActivityModule {
private final Activity activity;
public ActivityModule(Activity activity){
this.activity = activity;
}
// @Provides @PerActivity
// public Activity provideActivity(){
// return activity;
// }
@Provides
@PerActivity
ILoginActivity provideILoginActivity() {
return (LoginActivity) this.activity;
}
}
model提供你的对象,也就是你用到的对象,初始化你要的present的时候,或者全局用到的对象
@Provides
@PerActivity
ILoginActivity provideILoginActivity() {
return (LoginActivity) this.activity;
}
然后在mvp 的p里面:
public class LoginPresenter {
private IUserbiz userbiz;
private ILoginActivity loginActivity;
private int i = -1;
@Inject
public LoginPresenter(ILoginActivity loginActivity) {
this.loginActivity = loginActivity;
userbiz=new Userbiz();
}
inject一下
不得不说,dragger2很吊。全局 和局部的对象做的很好。
之后再loginactivity:
@Inject
LoginPresenter loginPresenter;
initInject();
private void initInject() {
// 构建Component并注入
getActivityComponent().inject(this);
// loginPresenter.attachView(this);
}
// 建议写在MyApplication类里
public AppComponent getAppComponent(){
return DaggerAppComponent.builder()
.appModule(new AppModule((App)getApplicationContext()))
.build();
}
// 建议写在基类Activity里
protected ActivityComponent getActivityComponent(){
return DaggerActivityComponent.builder()
.appComponent(getAppComponent())
.activityModule(getActivityModule())
.build();
}
// 建议写在基类Activity里
protected ActivityModule getActivityModule(){
return new ActivityModule(this);
}
ok,弄了一天,终于可以运行了。
第一,我不知道DraggerAppComment是动态生成的。很坑。
第二,就是原理理解的不到位,导致不知道怎么写。
总结一个:
dragger2 的作用就是依赖注入,并且分model和commpant, 比如okhttp全局一个就行,还有的是页面自己的一些对象,那么就写在自己的modules里面。
说白了就是写两个文件,一个module,一个commpant,而且格式不就是那样的。
哼,我为什么自卑。没有我做不到的。别人可以我也可以。不就是dragger2?
Dragger 2遇到的坑 Dragger2详解 Dragger2学习最好的资料的更多相关文章
- zz详解深度学习中的Normalization,BN/LN/WN
详解深度学习中的Normalization,BN/LN/WN 讲得是相当之透彻清晰了 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Ba ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- 《FPGA设计技巧与案例开发详解-第二版》全套资料包
本人参与写的一本书(TimeQuest一章由我所写),希望大家多多支持: 全书配套资料上传各大网盘资料中附送大量源码,你值得拥有--<FPGA设计技巧与案例开发详解-第二版>全套资料包-V ...
- Android Binder IPC详解-Android学习之旅(96)
linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...
- Android系统服务详解-android学习之旅(95)
本文是看完android框架揭秘第六章后的总结 android系统服务提供最基本的,最稳定的核心功能,如设备控制,信息通知,通知设定,以及消息显示等,存在于Android Framework与Andr ...
- .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ Masstransit 详解)--学习笔记
2.6.7 RabbitMQ -- Masstransit 详解 Consumer 消费者 Producer 生产者 Request-Response 请求-响应 Consumer 消费者 在 Mas ...
- Kubernetes 部署策略详解-转载学习
Kubernetes 部署策略详解 参考:https://www.qikqiak.com/post/k8s-deployment-strategies/ 在Kubernetes中有几种不同的方式发布应 ...
- Go依赖模块版本之Module避坑使用详解
前提 对于Go的版本管理主要用过 glide,下面介绍 Go 1.11 之后官方支持的版本管理工具 mod. 关于 mod 官方给出了三个命令 go help mod.go help modules. ...
- pyinstaller打包pyqt5,从入坑到填坑,详解
以上省略pyinstaller安装步骤,直入主题.先分享我的心路历程. 1.pyinstaller -F -i 1.ico UI_Main.py (先在CMD中 cd到 py文件对应的路径) 第一步打 ...
随机推荐
- C#多线程Thread
在项目中经常用到线程Thread,先做个简单记录,后面再完善下,方便以后参考.本人技术有限,如有不同见解之处,欢迎博友批评指正. 执行的线程Thread分无参数的,一个参数,多个参数的.直接看代码吧. ...
- PowerMock学习笔记,对单例的测试方法
对单例进行mock 单例类 public class PmModelHandler { // 包含要mock掉的成员变量 private static LogService logger = LogS ...
- K星异客
http://baike.baidu.com/view/222058.htm 这部改编自基恩·布汝尔1995年出版的同名小说的电影在当年的十月档票房榜上称冠.本来这部电影的外星人主人公属意于威尔.史密 ...
- vos忙时闲时费率不一样怎么设置
问题: 现有一客户要求上午闲时由原来的9:00追加到9:30 即: 9:30——12:00为忙时 14:00——18:00为忙时 其他为闲时 忙时费率为0.04元即4分 闲时费率为0.025元即2分5 ...
- TP5.0: 显示错误信息
在TP5中,我们运行的代码有错误无法执行时,只显示页面错误,而不显示错误信息 对我我来讲是无法接受滴!!毕竟我还是个小渣渣,查看了百度,解决方案是: 在application/config,php中找 ...
- nodejs一个函数实现消息队列中间件
消息队列中间件(Message Queue)相信大家不会陌生,如Kafka.RabbitMQ.RocketMQ等,已经非常成熟,在大大小小的公司和项目中也已经广泛使用. 有些项目中,如果是只使用初步的 ...
- 我的visual studio 配色方案 Rubik c++版
只是更改了c++的配色,放出来与大家分享,因为大胆地采用了各种颜色,所以我把它取名叫做Rubik,因为Rubik‘s cube也就是魔方,我本人是非常喜欢魔方的,然后也符合颜色丰富多彩的这个特征,希望 ...
- java集合框架——Set
一.Set概述 Set集合的特点是元素不允许重复,而且是无序的(添加和取出的顺序不一致). Set接口中的方法和Collection接口中的方法几乎相同,略. Set接口下常用的两个类:HashSet ...
- Altium_Designer-PCB中布局元器件时的翻转问题
这个问题是我在第一次对PCB元器件布局时发现的,当时我绘制好原理图生成PCB后,出现了这样一个情况: 在我反复尝试走线后,走好线发现很困难,最后我才想到如果能把这个器件反转一下问题不就都解决了吗!自己 ...
- POJ-3190 Stall Reservations---优先队列+贪心
题目链接: https://vjudge.net/problem/POJ-3190 题目大意: 有N头奶牛,每头奶牛都会在[1,1000000]的时间区间内的子区间进行挤奶.挤奶的时候奶牛一定要单独放 ...