【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android注解使用之Dagger2實(shí)現(xiàn)項(xiàng)目依賴(lài)關(guān)系解耦_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android注解使用之Dagger2實(shí)現(xiàn)項(xiàng)目依賴(lài)關(guān)系解耦_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android注解使用之Dagger2實(shí)現(xiàn)項(xiàng)目依賴(lài)關(guān)系解耦_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android注解使用之Dagger2實(shí)現(xiàn)項(xiàng)目依賴(lài)關(guān)系解耦_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android注解使用之Dagger2實(shí)現(xiàn)項(xiàng)目依賴(lài)關(guān)系解耦_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android注解使用之Dagger2實(shí)現(xiàn)項(xiàng)目依賴(lài)關(guān)系解耦

Dagger2

一句話:一款快速的注解框架,應(yīng)用于Android、Java,由Google開(kāi)發(fā)和維護(hù),是

Square

Dagger

項(xiàng)目的分支。

gitHub:/google/dagger

Dagger2采用依賴(lài)注入方式,依賴(lài)注入是一種面向?qū)ο蟮木幊棠J?,它的出現(xiàn)是為了降低耦合性,所謂耦合就是類(lèi)之間依賴(lài)關(guān)系,所謂降低耦合就是降低類(lèi)和類(lèi)之間依賴(lài)關(guān)系。依賴(lài)關(guān)系

Java的面向?qū)ο缶幊烫匦?,通常?huì)在一個(gè)Java對(duì)象中引用另一個(gè)Java對(duì)象,舉例說(shuō)明一下:public

class

ClassA

{

private

ClassB

classB;

public

ClassA(){

classB

=new

ClassB();

}

public

void

doSomething(){

classB.doSomething();

}

}通過(guò)上面的例子可以看出,ClassA需要借助ClassB才能完成一些特定操作,但是我們?cè)贑lassA直接實(shí)例化了ClassB,這樣耦合就產(chǎn)生了,第一違背了單一職責(zé)原則,ClassB的實(shí)例化應(yīng)該由自己完成,不應(yīng)該由ClassA來(lái)完成,第二違背了開(kāi)閉原則,一旦ClassB的構(gòu)造函數(shù)產(chǎn)生變化,就需要修改ClassA的構(gòu)造函數(shù)。通過(guò)依賴(lài)注入降低這種耦合關(guān)系:1.通過(guò)構(gòu)造參數(shù)傳參的方式public

class

ClassA

{

private

ClassB

classB;

public

ClassA(ClassB

classB){

this.classB

=classB;

}

public

void

doSomething(){

classB.doSomething();

}

}2.通過(guò)set方法的方式public

class

ClassA

{

private

ClassB

classB;

public

ClassA(){

}

public

void

setClassB(ClassB

classB)

{

this.classB

=

classB;

}

public

void

doSomething(){

classB.doSomething();

}

}3.通過(guò)接口注入的方式interface

ClassBInterface

{

void

setB(ClassB

classB);

}public

class

ClassA

implements

ClassBInterface

{

private

ClassB

classB;

public

ClassA()

{

}

@Override

public

void

setB(ClassB

classB)

{

this.classB

=

classB;

}

public

void

doSomething()

{

classB.doSomething();

}

}4.通過(guò)注解注入public

class

ClassA

{

@Inject

ClassB

classB;

public

ClassA()

{

}

public

void

doSomething()

{

classB.doSomething();

}

}Dagger2采用的就是注解注入的方式,然后編譯自動(dòng)生成目標(biāo)代碼的方式實(shí)現(xiàn)宿主與被依賴(lài)者之間的關(guān)系。Dagger2在Android的使用方式及簡(jiǎn)單說(shuō)明在Android中的使用方式很簡(jiǎn)單:只需在Module的build.gradle中添加一下配置dependencies

{

compile

'com.google.dagger:dagger:2.x'

annotationProcessor

'com.google.dagger:dagger-compiler:2.x'}

Dagger2annotation講解@Module修飾的類(lèi)專(zhuān)門(mén)用來(lái)提供依賴(lài)@Provides修飾的方法用在Module類(lèi)里@Inject

修飾需要依賴(lài)的地方(可以是構(gòu)造方法、field或者一般的方法)@Component連接@Module和注入的橋梁Dagger2舉例說(shuō)明

以項(xiàng)目中實(shí)際場(chǎng)景緩存管理為例,來(lái)體驗(yàn)一下解耦效果。設(shè)計(jì)遵循單一職責(zé)原則。LCache類(lèi)/**

*

Created

by

lichaojun

on

2017/3/30.

*

處理緩存

*/public

class

LCache

{

private

static

final

String

DEFAULT_CACHE_NAME="LCache";//默認(rèn)緩存名字

private

static

final

int

DEFAULT_MAX_CACHE_SIZE=1024;//默認(rèn)緩存名字

private

String

cacheName=DEFAULT_CACHE_NAME;//緩存名字

private

int

maxCacheSize=DEFAULT_MAX_CACHE_SIZE;

public

LCache

(){

}

@Inject

public

LCache(String

cacheName,int

maxCacheSize){

this.cacheName=cacheName;

this.maxCacheSize=maxCacheSize;

}

public

void

saveCache(String

key

,String

value){

Log.e(LCacheManager.TAG,"cacheName:

=

"+cacheName);

Log.e(LCacheManager.TAG,"maxCacheSize:

=

"+maxCacheSize);

Log.e(LCacheManager.TAG,"saveCache:

key

=

"+key

+"

value

=

"+value);

}

public

void

readCache(String

key){

Log.e(LCacheManager.TAG,"readCache:

key:

=

"+key);

}

}LExecutor類(lèi)public

class

LExecutor

{

private

static

final

int

DEFAULT_CPU_CORE

=

Runtime.getRuntime().availableProcessors();//默認(rèn)線程池維護(hù)線程的最少數(shù)量

private

int

coreSize

=

DEFAULT_CPU_CORE;//線程池維護(hù)線程的最少數(shù)量

@Inject

public

LExecutor(int

coreSize)

{

this.coreSize

=

coreSize;

}

public

void

runTask(Runnable

runnable)

{

if

(runnable

==

null)

{

return;

}

Log.e(LCacheManager.TAG,"coreSize:

=

"+coreSize);

Log.e(LCacheManager.TAG,

"runTask");

runnable.run();

}

}LCacheModule類(lèi)@Modulepublic

class

LCacheModule

{

/**

*

提供緩存對(duì)象

*

@return

返回緩存對(duì)象

*/

@Provides

@Singleton

LCache

provideLCache()

{

return

new

LCache("lcj",500);

}

}LExecutorModule類(lèi)@Modulepublic

class

LExecutorModule

{

/**

*

提供app

多任務(wù)最少維護(hù)線程個(gè)數(shù)

*

@return

返回多任務(wù)最少維護(hù)線程個(gè)數(shù)

*/

@Provides

@Singleton

LExecutor

provideLExecutor()

{

return

new

LExecutor(10);

}

}@Component(modules

=

{LCacheModule.class,LExecutorModule.class})

@Singletonpublic

interface

LCacheComponent

{

LCache

lCache();

//

app緩存

LExecutor

lExecutor();

//

app多任務(wù)線程池

void

inject(LCacheManager

lCacheManager);

}/**

*

Created

by

lichaojun

on

2017/3/30.

*

緩存處理管理

*/

public

class

LCacheManager

{

public

static

final

String

TAG=LCacheManager.class.getSimpleName();

private

LCacheComponent

cacheComponent;

private

static

class

SingletonHolder

{

private

static

LCacheManager

instance

=

new

LCacheManager();

}

private

LCacheManager(){

cacheComponent

=

DaggerLCacheComponent.builder().lCacheModule(new

LCacheModule()).build();

cacheComponent.inject(this);

}

public

static

LCacheManager

getInstance()

{

return

SingletonHolder.instance;

}

public

void

saveCache(final

String

key

,

final

String

value)

{

cacheComponent.lExecutor().runTask(new

Runnable()

{

@Override

public

void

run()

{

cacheComponent.lCache().saveCache(key,value);

}

});

}

public

void

readCache(final

String

key){

cacheComponent.lExecutor().runTask(new

Runnable()

{

@Override

public

void

run()

{

cacheComponent.lCache().readCache(key);

}

});

}

}LCacheManager.getInstance().saveCache("key","who

is

lcj

?");看下打印結(jié)果:通過(guò)Dagger2的方式剛開(kāi)始可能會(huì)覺(jué)得突然間一個(gè)簡(jiǎn)單的事情,變得復(fù)雜了,其實(shí)沒(méi)有,通過(guò)Dagger2很好的處理好了依賴(lài)關(guān)系,具體說(shuō)明,比如我們緩存LCache需要添加一個(gè)最大緩存?zhèn)€數(shù)變化,如果按照之前的方式,我們首先需要對(duì)LCache進(jìn)行修改,比如修改構(gòu)造函數(shù)增加maxCacheSize,然后必須對(duì)LCacheManager進(jìn)行修改,現(xiàn)在通過(guò)Dagger2的方式的話,我們只需修改LCacheModule就可以了,LCache實(shí)例化和相關(guān)參數(shù)和LCacheManager之間并沒(méi)有太大的依賴(lài)關(guān)系。

基于上面的緩存處理需求,我們需要實(shí)現(xiàn)讀寫(xiě)分別使用不同的多任務(wù)LExecutor,并且LExecutor的最小線程數(shù)為5,我們會(huì)在LCacheComponent添加提供writeLExecutor函數(shù),如下:@Component(modules

=

{LCacheModule.class,LExecutorModule.class})

@Singletonpublic

interface

LCacheComponent

{

LCache

lCache();

//

app緩存

LExecutor

lExecutor();

//

app多任務(wù)線程池

LExecutor

writeLExecutor();

//

app

寫(xiě)緩存多任務(wù)線程池

void

inject(LCacheManager

lCacheManager);

}在LExecutorModule中添加提供依賴(lài)初始化的provideWriteLExecutor函數(shù)。如下:@Modulepublic

class

LExecutorModule

{

/**

*

提供app

多任務(wù)最少維護(hù)線程個(gè)數(shù)

*

@return

返回多任務(wù)最少維護(hù)線程個(gè)數(shù)

*/

@Provides

@Singleton

LExecutor

provideLExecutor()

{

return

new

LExecutor(10);

}

/**

*

提供app

多任務(wù)最少維護(hù)線程個(gè)數(shù)

*

@return

返回多任務(wù)最少維護(hù)線程個(gè)數(shù)

*/

@Provides

@Singleton

LExecutor

provideWriteLExecutor()

{

return

new

LExecutor(5);

}

}然后寫(xiě)完之后Rebuild一下項(xiàng)目,以為萬(wàn)事大吉了,結(jié)果報(bào)了如下錯(cuò)誤,怎么辦呢,難道Dagger2就這么不堪一擊嗎,當(dāng)然不是解決這個(gè)問(wèn)題很容易,使用@Named注解解決這個(gè)問(wèn)題,我們只需要在LCacheComponent的writeLExecutor()和LExecutorModule的provideWriteLExecutor()函數(shù)上添加相同的@Named("WriteLExecutor")即可。對(duì)于Module的provide函數(shù)也是

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論