Android开源框架集合分享-依赖注入篇

         现在的android开发早已不是多年的光景了,那个时候多种大而全的框架独霸市场,为众多开发者而喜爱。

   为什么呢,原因就是开发利器啊,特别不是大公司的做自己的产品,要求是精益求精,都去封装自己的

   框架去了。但是这种产品在当下APP市场千万的上架量来说确实是珍惜动物了,大部分都是凡人了,哈哈。

        特别是在外包公司工作的小伙伴的都知道,那做的都是什么样的项目,从工时就可以看出东西的质量,

所以为了提高效率,一方面是加班,另一方面是总结工具类,使用大神的框架。框架好不好,自己用了才知道,

全球最大的男性交友网站GitHub上有很多牛人共享的框架来让我们学习使用,现在单就框架市场来说,

已经结束了当初七国争雄的局面,进入百家争鸣的时代了。

这次分享的资料,并不是一家独有,算是综合许多大神的精华,我只是稍加编写,便于查看和使用

主要分为依赖注入,网络加载,图片加载,数据库,响应式编程,第三方分享登录,消息推送,Bug追踪

数据统计。现在主要就这些模块,后期还在继续整理。

1.为什么要使用开源框架

     提高开发速度

     提高开发质量

     学习高质量的代码(精品框架)

2.选择开源框架的原则

    聚合性框架一定要放弃.例如Afinal,xUtils,AndBase等

   大而全的框架容易导致牵一发而动全身.可读性差,耦合高,难扩展.

   last commit超过一年以上或者issues一大堆没有fix的框架不要用.(技术更新太快了)

   选择活跃度和人气高的项目

3.常见依赖注入开源库

1.1依赖注入_概念

依赖(Dependency)

如果在ClassA中用到了ClassB的实例,我们通常会直接new一个ClassB的对象,这种情况称为调用者ClassA对被调用者ClassB有一个依赖

例如下面的代码中Customer就依赖与Person.

示例代码中Person这种直接初始化的方式也叫Hard Init方式,弊端在于两个类之间不够独立,如果我们更改了Person的构造函数,所有使用到Person初始化方法的代码都要进行修改.

public    class   Customer{

public    static   void   main(String[] args) {

Person person = new Person();

   }

}

依赖注入(DI:Dependency Injection):

指程序运行过程中,调用者(HRSystem)需要被调用者(Person)的辅助,但是创建被调用者(Person)的工作不再由调用者(HRSystem)来完成,因此称为控制反转(IOC:Inversion of Control),而是由相关的容器控制程序将被调用者(Person)的对象在外部创建出来并注入到调用者(HRSystem)的引用中

public class HRSystem {

@Inject

Person person;

public static void main(String[] args) {

    }

}

为什么要使用依赖注入

依赖注入是实现控制反转的方式之一(另一方式是依赖查找),目的就是为了让调用者和被调用者之间解耦

可以注入依赖的模拟实现,使得测试变得更加简单.

1.2依赖注入_Butterknife(体积小,功能强)

主页:https://github.com/JakeWharton/butterknife

用途: 主要用来简化各种初始化控件的操作

配置:

在build.gradle文件中dependencies节点添加如下代码 Add this to you project-level build.gradle:(在project的build,也就是最外层的)

buildscript {

       repositories {

       mavenCentral()

}

dependencies {

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

          }

     }

}

在module的build中添加一下内容,也就是里面的APP中

apply plugin: 'android-apt'

android {

...

}

dependencies {

compile 'com.jakewharton:butterknife:8.1.0'

apt 'com.jakewharton:butterknife-compiler:8.1.0'

}

也可以在Android Studio中点击 File-->Settings-->Plugins-->Browse repositories,搜索Android ButterKnife Zelezny插件,安

装成功以后重启Android Studio.开发中的一大利器


插件大小


在布局文件中添加控件的时候,所有需要在Activity/Fragment代码中进行控制的控件都要添加id属性

在Activity/Fragment 代码中,将鼠标放在布局文件的引用上(即R.layout.activitymain中的activitymain上面),此时按快捷键Alt + Insert或鼠标右键选择Generate

在弹出的菜单中选择Generate ButterKnife Injections,此时会再次弹出一个对话框

新的对话框中点击confirm后直接生成控件的引用,代替findViewById

如果需要处理控件的点击事件,可以选择对应控件的OnClick复选框.

如果是ListView的Item视图,还可以选择左下角的Create ViewHolder复选框,生成ViewHolder静态类.

技巧

在AndroidStudio\plugins\android\lib\templates\gradle-projects\NewAndroidModule\recipe.xml.ftl中添加如下代码,以后新创建的工程默认会添加Butterknife依赖:

<dependency  mavenUrl = "mavenUrl="com.jakewharton:butterknife:7.0.1" />

1.3依赖注入_AndroidAnnotations(这个倒是没怎么用过)

主页:[http://androidannotations.org/]

用途:

     1.使用依赖注入Views,extras,System Service,resources

     2.简化线程模型

     3.事件绑定

     4.REST Client

配置:

1.在project/build.gradle 文件中按下图所示添加代码:

mavenCentral()

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

mavenCentral()

mavenLocal()

2.在app/build.gradle 文件中按下图所示添加代码:

apply plugin: 'android-apt'

apt {

arguments {

androidManifestFile variant.outputs[0]?.processResources?.manifestFile

            }

     }

apt "org.androidannotations:androidannotations:4.0.0"

compile "org.androidannotations:androidannotations-api:4.0.0"

注意事项:

* Manifest中注册的activity要在原类名后追加下划线”_”

* 使用注解的控件和方法不能使用private修饰符

* 大型项目并不适用

1.4依赖注入_Dagger2

主页:https://github.com/google/dagger

历史:

Dagger1是由Square公司受到Guice(https://github.com/google/guice)启发创建的依赖注入框架.

Dagger2是Dagger1(https://github.com/square/dagger)的分支,由谷歌开发.该项目受到了Auto项目(https://github.com/google/auto)的启发

Dagger2的优点

没有使用反射,图的验证、配置和预先设置都在编译的时候执行

容易调试,完全具体地调用提供和创建的堆栈

更高的性能,谷歌声称他们提高了13%的处理性能

代码混淆,使用派遣方法,就如同自己写的代码一样

配置:

在project/build.gradle 文件中按下图所示添加代码: 

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

在app/build.gradle 文件中按下图所示添加代码:

apply plugin: 'com.neenbedankt.android-apt'

compile 'com.google.dagger:dagger:2.2'

apt 'com.google.dagger:dagger-compiler:2.2'

provided 'org.glassfish:javax.annotation:10.0-b28'

主要的注解:

@Provides: 用来修饰方法,方法的返回类型就是所提供的依赖类型,可以简单的把方法的返回值理解为我们通常要new出来的对象.

@Provides方法都会用provide作为前缀

@Module: 所有的@Provides方法都必须放到一个Moudle中,一个Moudle就是使用@Moudle修饰的类,可以简单的理解为一个持有各种对象的仓库.用来给@Component组件提供实例化的对象.

Android中有三种Module:ApplicationModule,ActivityModule,UserModule,分别提供整个应用级别的(只生成一个该组件的实例),Activity级别的,用户级别的Module。

@Module类都用Module作为后缀

@Inject: 通常在需要依赖的地方使用这个注解,简单的理解为声明一个对象

@Component 它是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分.

我们必须用@Component注解一个接口,为该注解传入Module类,或者添加其依赖的组件

@Component注解的接口或抽象类以Component为后缀

@Component的实现类

@Component注解的接口或抽象类,Dagger将会为该接口或者抽象类生成一个实现,这个实现的命名是在接口或抽象类前面加上Dagger,如MyComponent生成的实现是DaggerMyComponent

使用步骤:

创建Module,并在其中创建Provides.示例代码:

@Module

public class MainActivityModuel {

@Provides

User provideUser(){

return  new User("zhangsan", 12,"18612345678");

     }

}

创建Component.示例代码:

@Component(modules = MainActivityModuel.class)

public interface MainActivityComponent {

       void inject(MainActivity activity);

     }

Rebuild工程,生成对应的以Dagger开始的工具类

利用对应的以Dagger工具类初始化,并注入对象.示例代码:

public class MainActivity extends AppCompatActivity {

   @Inject

   User user;

   @Override

    protected void onCreate(Bundle savedInstanceState) {

             super.onCreate(savedInstanceState);

             setContentView(R.layout.activity_main);

             MainActivityComponent component = DaggerMainActivityComponent.builder().

             mainActivityModuel(new MainActivityModuel()).build();

             component.inject(this);

       }

}

以上就是关于依赖注入的框架的一些总结,关于Xutils并没有被总结上,原因前边已经说过了,不过要是应对一些特殊的需求还是可以的

如果有需要的,可以关注留言,我再集合整理一下。也可以加好友,讨论一下技术问题,940917911

上面的资料大部分都是实践过的,如果有什么不对的地方,请各位朋友及时的指出来,

框架先学习再使用,然后开始进阶学习编写自定义的框架。

框架先学习再使用,然后开始进阶学习编写自定义的框架。

框架先学习再使用,然后开始进阶学习编写自定义的框架。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容