Android Dagger2 初學筆記

Android Dagger 2 初學筆記

前言

看了大部分的 Dagger 2 教程博客,大多都說的幾點功能:

  • 模塊間解耦,提高代碼的健壯性和可維護性
  • 訪問全局對象的實例方式更簡單
  • 方便進行測試
  • 方便管理作用域

由於初學Android,對解耦測試作用域瞭解不是很深入,目前並沒有用到相關內容,所以現在只瞭解清楚了它實例化對象的過程

本文就筆者實現基本的Dagger 2 依賴注入功能做一些記錄

日後若有用到其他強大功能,再做記錄說明(肯定會用到其他功能的)

直接結合MVP框架進行示例

簡介

依賴注入 ( Dependency Injection簡稱 di ) 不做說明

在這裏我將用框架實現Presenter類在Activity中的實例化

MVP初學筆記中的實現方法:

mPresenter = new MyPresenter(this);

這裏引入一張圖

Dagger2 流程

(先拋開 Application 不講)

由三部分組成:Module + Component + Activity

Module

負責實例化Presenter類(@Provides

構造函數在Activity中傳參

將自身提供給Component

Component

規定作用域

依賴Module

定義注入方法,參數爲目標類

Activity

定義Presenter時加一個@Inject註解

通過DaggerXXComponent.builder().Module()完成對Module的構造

通過DaggerXXComponent.inject(this)完成注入

Presenter被實例化

看起來比原來的new方法來的複雜的多呀。。。

還有一些註解的使用在下文簡單說明

示例

實例化

MyModule

@Module
public class MyModule {

    private Context mContext;

    /**
     * 構建MyModule時,將Context傳進來
     * @param mContext 這裏指MyActivity
     */
    public MyModule(Context mContext) {
        this.mContext=mContext;
    }

    @Singleton
    @Provides
    MyPresenter providerMyPresenter(){
        return new MyPresenter(mContext);
    }

}

Module類一定要有@Module註解

返回實例化的方法上要有@Provides註解,方法名一般爲provideXXPresenter()

@Singleton的理解還不夠清晰,日後再做解釋

添加依賴

MyComponent

@Singleton
@Component(modules = MyModule.class)
public interface MyComponent {

    void inject(MyActivity activity);

}

Component類一定要有@Component註解,並且參數 modules 設置爲要添加的Module

這裏定義注入方法(一般爲)inject,參數爲Activity

下面要做的就是在Activity類中調用這個方法實現注入(實例化)

注入

MyActivity

public class MyActivity extends AppCompatActivity implements MyView{

  ImageView helloIv;

  @Inject
  MyPresenter mPresenter;//在MyModule中provide的實例

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    helloIv=findViewById(R.id.iv_helloimg);

    //Dagger注入 實例化
    DaggerMyComponent.builder()
      .myModule(new MyModule(this))
      .build()
      .inject(this);

    mPresenter.onCreate();
    mPresenter.attachView(this);//綁定View並且實現方法
    //mPresenter.getImage();
    //TODO
  }

在要實例化的類 定義時添加註解@Inject

完成之前的Module以及Component的創建後,build操作一下,框架會自動生成一個DaggerXXXComponent類(這裏是DaggerMyComponent

  • Module類進行傳參構造(參數實際上爲Presenter服務)

    .builder().myModule(new MyModule(this)).build()
  • 實現注入(調用inject()方法)

    .inject(this)

到這裏就算是完成了整個過程,之後就可以直接使用@Inject註解定義的實體(Presenter)了

總結

這裏只是一種比較基礎(小白)的 Dagger 2 實現的方式

觀察Google官方代碼的話,應該有更具體(牛逼)的方式實現

一般Dagger 2與MVP結合使用

(Google的Demo是真的很到位)

Google Android MVP + Dagger 2 Demo

學習過程中看過的博客:

好像還有一個Dagger 2應用於Android的完美擴展庫dagger.android,日後再研究

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