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

下邊是一個GIF的演示,看文字確定有點費勁,看是看圖方便。

如果需要處理控件的點擊事件,可以選擇對應控件的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的優點

  1.  沒有使用反射,圖的驗證、配置和預先設置都在編譯的時候執行
  2. 容易調試,完全具體地調用提供和創建的堆棧
  3. 更高的性能,谷歌聲稱他們提高了13%的處理性能
  4. 代碼混淆,使用派遣方法,就如同自己寫的代碼一樣

配置:

在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

上面的資料大部分都是實踐過的,如果有什麼不對的地方,請各位朋友及時的指出來,不剩感激。

簡書鏈接:https://www.jianshu.com/p/51c95dce2894

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章