7. 卷死了---Android 抖音實戰(zhàn)Hilt注入retrofit: Dagger替換成Hilt

什么是依賴注入吨艇?---朱凱

這些都屬于由外部來提供依賴的初始化与斤,所以都是依賴注入

Hilt 好不好用网持,我們先來看看它是個什么画切。它是個用注解來進行配置的依賴注入庫竣稽。注解是它的寫法,首先它是個依賴注入庫霍弹,對吧毫别?什么是依賴注入?一個類里有兩個變量典格,這兩個變量就是它的依賴:

總結(jié):通過外部進行賦值

依賴注入的好處:數(shù)據(jù)共享

比如:activity岛宦。Prsenter,module里面都要用同一個user耍缴,可以通過hilt實現(xiàn)數(shù)據(jù)共享砾肺。

hilt和dragger2的區(qū)別

hilt:使用簡單,然后是場景化私恬,不是封裝

dragger2:使用復雜

一個注解就能讓 Activity 內(nèi)部的依賴自動被注入债沮,而 Dagger 需要手動注入,就是調(diào)用inject方法!

ButterKnife 或者現(xiàn)在 Jetpack 推出的 ViewBinding 它們提供的功能本鸣,Hilt 提供了嗎疫衩?

不好意思,Hilt 不提供它們的功能荣德。Hilt 和 Dagger 雖然用法和 ButterKnife 很像闷煤,都是給變量加注解,然后變量會自動賦值涮瞻,但它們的功能定位是不一樣的:Hilt 和 Dagger 是做依賴注入的鲤拿,而 ButterKnife 和 ViewBinding 是做視圖綁定的。

Hilt是對Dagger2的封裝署咽。就像retrofit是對okhttp的封裝一樣近顷。

那么 Hilt 是什么呢?Hilt 是一個內(nèi)部使用 Dagger 的庫宁否,只是簡化了它的用法窒升,因此我在這里所說的有關(guān) Dagger 的內(nèi)容也適用于 Hilt

相比于Dagger2,Hilt最明顯的特征就是:1. 簡單慕匠。2. 提供了Android專屬的API饱须。

Hilt原理:

1.dagger里面的apt

2.自動注入,通過字節(jié)碼插樁 javaassist台谊,在oncrate之前蓉媳,用另外一個activity譬挚!

Hilt 做的優(yōu)化包括

無需編寫大量的Component代碼

Scope也會與Component自動綁定

預定義綁定,例如 Application與Activity

預定義的限定符酪呻,例如@ApplicationContext與@ActivityContext

————————————————

應用實戰(zhàn):網(wǎng)絡(luò)請求的多個框架减宣,封裝成了代理模式,然后可以改成依賴注入M孳r揭浮!姨蟋!

里面有application,activity,Fragment的注解

Hilt 應用類
所有使用 Hilt 的應用都必須包含一個帶有 @HiltAndroidApp 注釋的 Application 類屉凯。

@HiltAndroidApp
class MyApplication:Application() {
}

生成的這一 Hilt 組件會附加到 Application 對象的生命周期,并為其提供依賴項眼溶。此外悠砚,它也是應用的父組件,這意味著堂飞,其他組件可以訪問它提供的依賴項灌旧。我們查看生成的源碼可以看到一個Hilt_MyApplication類,這是此注解生成類之一绰筛,它是hilt組建全局的管理者

將依賴項注入 Android 類=============(是入口嗎)
在 Application 類中設(shè)置了 Hilt 且有了應用級組件后枢泰,Hilt 可以為帶有 @AndroidEntryPoint 注釋的其他 Android 類提供依賴項,現(xiàn)在我們先在我們熟悉的MainActivity添加這個注釋,看看會發(fā)生什么:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

可以使用注入框架進行實例的創(chuàng)建铝噩,不需要new

@Inject lateinit var user:User//定義一個User對線

實踐:

第一步:添加依賴

根目錄:

classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'

主目錄:

apply plugin: 'dagger.hilt.android.plugin'

implementation "com.google.dagger:hilt-android:2.28-alpha"

annotationProcessor "com.google.dagger:hilt-android-compiler:2.28-alpha"

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 }</pre>

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">第二步:定義bean</pre>

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">
public class HttpObject {
}
</pre>

第三步:Module</pre>

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@InstallIn(ApplicationComponent.class)
@Module public class HttpModule {

@Singleton

@Provides public HttpObject getHttpObject(){
return new HttpObject();
}
}
</pre>

同時把module安裝到component里面去</pre>

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@InstallIn(ApplicationComponent.class)</pre>

<pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">第四步:使用:注入點</pre>

注入到Activity

<pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@AndroidEntryPoint public class MainActivity extends AppCompatActivity {

@Inject

HttpObject httpObject; @Inject
HttpObject httpObject2; @Inject
public TestInterface testInterface; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("hqk_MainActivity",httpObject.hashCode()+"");
Log.i("hqk_MainActivity",httpObject2.hashCode()+"");
testInterface.method(); }</pre>

第五步:application中定義</pre>

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@HiltAndroidApp public class MyApplication extends Application {
}
</pre> </pre>

Hilt 接口的使用

原理:最終通過module實現(xiàn):饴臁!?ビ埂C住!具被!

一個接口很多實現(xiàn)類玻募,接口具體實現(xiàn)。

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">public interface TestInterface {

void method(); }

</pre>

2一姿、提供一個實現(xiàn)接口的對象

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">public class TestClass implements TestInterface {

@Inject

TestClass() {
}

@Override

public void method() {
Log.i("TestClass", "TestClass注入成功七咧!");
}
}
</pre>

3、編寫對應Module

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">@Module @InstallIn(ActivityComponent.class)
public abstract class TestInterfaceModule {

// @Binds // public abstract TestInterface bindTestClass(TestClassTwo testClass //實現(xiàn)不同的 功能); @Binds
public abstract TestInterface bindTestClass(TestClass testClass); }
</pre>

4叮叹、最終使用

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">@Inject public TestInterface testInterface; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("hqk_MainActivity",httpObject.hashCode()+"");
Log.i("hqk_MainActivity",httpObject2.hashCode()+"");
testInterface.method(); </pre>

hilt對項目的一個封裝(jetpack-hilt-flow-mvvm 超簡潔實戰(zhàn)項目)

http://www.reibang.com/u/cf8709c5d63a

recycleView

http://www.reibang.com/p/a1f21380a43d

http://www.reibang.com/p/fd4f090c882e---朱凱視頻

https://juejin.cn/post/6978407567047262222?share_token=d66a5860-52fe-4257-93d4-7bca921e8be3

https://juejin.cn/post/6902009428633698312?share_token=35134c40-3d98-47cf-95a0-1ec670f6bdca

demo:

https://blog.csdn.net/qq_30382601/article/details/118675425

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艾栋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子衬横,更是在濱河造成了極大的恐慌裹粤,老刑警劉巖终蒂,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜂林,死亡現(xiàn)場離奇詭異遥诉,居然都是意外死亡,警方通過查閱死者的電腦和手機噪叙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門矮锈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人睁蕾,你說我怎么就攤上這事苞笨。” “怎么了子眶?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵瀑凝,是天一觀的道長。 經(jīng)常有香客問我臭杰,道長粤咪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任渴杆,我火速辦了婚禮寥枝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磁奖。我一直安慰自己囊拜,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布比搭。 她就那樣靜靜地躺著冠跷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪身诺。 梳的紋絲不亂的頭發(fā)上蔽莱,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音戚长,去河邊找鬼盗冷。 笑死,一個胖子當著我的面吹牛同廉,可吹牛的內(nèi)容都是我干的仪糖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼迫肖,長吁一口氣:“原來是場噩夢啊……” “哼锅劝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蟆湖,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤故爵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隅津,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诬垂,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡劲室,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了结窘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片很洋。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隧枫,靈堂內(nèi)的尸體忽然破棺而出喉磁,到底是詐尸還是另有隱情,我是刑警寧澤官脓,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布协怒,位于F島的核電站,受9級特大地震影響卑笨,放射性物質(zhì)發(fā)生泄漏斤讥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一湾趾、第九天 我趴在偏房一處隱蔽的房頂上張望芭商。 院中可真熱鬧,春花似錦搀缠、人聲如沸铛楣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽簸州。三九已至,卻和暖如春歧譬,著一層夾襖步出監(jiān)牢的瞬間岸浑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工瑰步, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矢洲,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓缩焦,卻偏偏與公主長得像读虏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袁滥,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容