[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

Cang_Wang發表於2019-03-02

大家好,我係蒼王。

以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。

[Android]如何做一個崩潰率少於千分之三噶應用app–章節列表

相信大家都有看過今年的Google I/O,估計對我們Android程式設計師來說,應該是最重磅的訊息是Google要將Kotlin作為Android開發的第一語言,並且說Android studio3.0將自動相容Kotlin的開發。

然後,第二天這種關於Kotlin的推文和教程在你的朋友圈瘋傳。然後你覺得現在的研發流程很好,為何要改呢?有點對新技術的小牴觸,你的Android技術圖譜裡面又要增添一樣的學習內容。

工具在進步,語言在進步,當然人也要跟著進步。

然後,就想把自己的Gank工程用kotlin武裝一下吧。

藉著近來大熱的Kotlin,讓我的元件化Gank爆一波吧。

地址是元件化Gank(https://github.com/cangwang/Gank/tree/kotlin)

這個是元件化Gank的kotlin分支,如果大家覺得有用麻煩star一下,謝謝!

前兩年就有接觸過kotlin,寫了一下,發現自己連kotlin的handler也寫不出(學習成本有時真的挺高的)。需要了解一下kotlin的特性,然後我花了三天的時間將我的Gank從java轉成了Kotlin,裡面踩到的坑,真的有時候讓人覺得無語了,這裡就跟大家說一下,我在這次轉換中遇到一些什麼狗血的問題吧。

一.元件化Kotlin配置

說一下Kotlin的配置。

我們的Kotlin安裝需要安裝Plugin,其可以相容Android studio2.0多以上的版本。

然後現在的版本是1.1.2-7版本。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

肯定大夥關注的都知道,可以使用Android Studio3.0的預覽版了,我事先踩了一下坑,發現Android Studio直接轉編譯我的Gank元件化的工程,發現編譯出來的包,根本安裝都失敗。(Are you kidding me?)這坑真的蠻大的。。。

所以提醒大家Android Studio3.0有勇氣去先踩坑的可以去考慮,我搞了兩個鍾,還是無法編譯成功,還是等版本把這巨坑fix吧。

Kotlin其實已經發布了兩年多,但是還是沒有國內還是像swift一樣,沒有給予太大的關注,究竟推行如何,最好還是要太Google有多大的決心要替換Kotlin為主語言了。

配置其實很簡單,我們在Tools->Kotlin->Configure Kotlin inProject可以找到配置路徑。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

然後需要選擇需要配置的module,有勇氣當然是全module啦。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

然後他將會幫你配置最新的1.1.2-7的版本到depencies裡面

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

然後還會在每個工程裡面給你引入kotlin-android,結果第一個坑來了。詐一看,這應該沒有什麼問題啊,然而立刻配置不通過。。。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

因為這裡裡面com.android.xxx的一定要先引入的。kotlin-android一定要比它後引入,不然報錯,自己慢慢找除錯臺資料吧。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

然後它會在每個module的dependencies裡面引入kotlin-stdlib,這裡一開始會引入kotlin-stdlib-jre的版本的。之後會在這裡介紹會有什麼坑。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

那就開始我們的轉換之旅了

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

這裡可以選擇一次過轉換全部的工程檔案。但是一般來說我們只需要轉src裡面的java檔案。而有一些檔案轉換是會讓工程出現卡死現象。我就有某個工程出現了,所以我暫時先越過它,等以後知道原因再做轉換。

****2017.5.24****

這裡有個非常方便的東西,如果你直接將java程式碼貼上到kotlin檔案裡面,kotlin會很友好提示我們是否要將程式碼轉為kotlin編寫,這樣大大增加我們的效率。

然後我找到了程式碼轉換失敗的原因了,是因為Handler轉化問題。如果程式碼存在Handler,java轉化為kotlin的時候很大程度會出現假死的問題。

所以大家請一定要注意,java程式碼轉為Kotlin程式碼千萬別帶Handler 或者 自定義Runnable,不然編譯器會進入假死。只能自己敲程式碼轉換了。

二.程式碼轉換問題

(1)View沒有引入

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

本來Android工程應該預設引入View包

這裡往往是你使用了View的一些屬性沒有引入進去。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

(2)值判空問題

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

其實很簡單,其需要物件為非空,而你告訴她現在你的物件有可能為空,kotlin的提示機制還是很安全的。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

這裡還是先判空吧,不然用兩個!!,崩了就自找麻煩了。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

(3)值轉換問題

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

這裡我們不能有些自定義View的屬性,最好還是要檢查一下,是否沒宣告或者轉換的時候出現錯誤。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

這裡轉為float值就可以了。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

(4)關聯module轉換的時候,轉換引用的時候會漏掉某些屬性

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

例如BaseActivity 放在base module,其他module引用到,然後先宣告轉換一個module的時候,會發現引用只會宣告為protected

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

這裡換為override就沒問題了

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

(5)列表轉換問題

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

這裡會轉ArrayList,kotlin會將其轉換為MutableList

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

然而因為我們平常轉換輸入的時候是List的物件,那麼我們就需要強轉為MutableList

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

接下來是噁心的databinding問題

我們kotlin配置databinding,除了要配置一般的databinding以外,

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

還需要配置kapt

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

引入kapt的庫

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

(6)kapt的編譯問題

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

很明顯是compileReleaseKotlin和kaptReleaseKotlin衝突了

這邊暫時可行的方法是,降低kotlin的版本,現在的是1.1.2-7而我們降低到1.1.2或者1.1.2-3(親測沒問題)

(7)無法生成databinding檔案

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

好吧,這裡介紹一個方法,大家認真認真的看Gradle Console的除錯版,會告訴你某些屬性存在問題的。

(8)這裡是還有巨坑,給你提示自定義Application的問題。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

其實問題完全不是因為這個Application的問題,

看除錯版找到真正原因

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

這裡就是應為遇到DataBindingAdapter找不到app:imageurl的物件引起的,為何會找不到。

因為我的ImageLoader是放在了base module裡面,沒有加入kapt的引用,所以其編譯索引不會索引到。

這裡面還需要注意一定生成app的主 module也需要加入kapt的引用,不然連app都無法生成成功。

(9)test沒有加入kapt編譯

我們可以看到我們一般生成工程的時候,會加入test的資料夾和引用

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

因為之前引用的是java的測試庫,而kotlin需要它特有的測試庫,那麼我們需要更換其編譯庫。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

解決的相關地址Stackoverflow

(10)單例問題

單例轉換現在都無法做到完全的轉換成功的,因為單例寫法比較複雜,所以轉換很容易會出問題。

我用的是double check的單例

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

很明顯用的伴生物件,然後通過get的方法來宣告我要獲取的CommonRetrofit的物件。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

關於kotlin的教學,推薦一下騰訊裡面有一個kotlin的基礎教程,非常建議,說得也很清晰。

我的單例問題解決是參照這上面的教程。

****2017.5.24****

Handler問題,因為直接轉換Handler和Runnable會假死。

這裡給大家一些編寫的提示,如果迴圈用handler呼叫runnable,Handler需要先通過object例項化。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

這樣寫是不能通過的。我們需要將其轉換為更加這個物件宣告呼叫為自身,這樣才能正常運用。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

這個有點小糾結了一下。

三.執行相關問題

(11)路由跳轉

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

我使用的是ARouter,提示無法找到route matched。

很有可能是kapt註解暫時無法支援生成路由RouteMatch檔案。

暫時這邊只能換為隱式跳轉。

(12)遇到Adapter資料問題

相信大家都遇到過Fragment顯示然後才載入資料方法。

然後我們會在setUserVisiblehint中更新

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

然而我們的RecylerView裡面的資料物件

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

顯示這裡為空

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

不明真相的時候以為這樣初始化的沒問題的。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

然而我們重點是需要datas的物件初始化,這才是正確的初始化,這樣才不為null,size才能正常返回。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

(13)BindingAdapter問題

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

告知我們無法找到ImageLoader的loadImage方法。因為無法其不是static屬性的。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

然後我們加上JvmStatic註解,說的是java中的static屬性。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

(14)DataBindingAdapter無空提示

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

咋一看沒什麼問題

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

因為這裡因為databinding的關係,其經過xml的關聯,所以其無法知道xml傳遞過來的資料是否有空的情況。

然後這裡因為Gank返回回來的圖片的url地址有可能為空,而我沒有給予宣告,那麼接下來就會報為空值的錯誤了。

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

一個問號能解決的事情啊。

(15)WebView的onPageStart的問題

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

連原生的onPageStated介面的都是有相容問題的,所以你還想信愛情嗎?而且原生是呼叫java編寫的,更加無法提示錯誤。

看起來很正常,其實這裡裡面是favicon這個引數問題

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

還是一個問號可以解決的問題啊

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

原生是沒有非空的提示的,所以有些原生方法的呼叫,還地自己修改介面,大家要小心。

四.總結

搞了三天終於從坑裡跳出來了,然後感覺自己對kotlin的瞭解更加深入。

1.出現問題,一定要認真看除錯版,可能除錯版資訊kapt衝突可能都不是真正原因,可能只是xml等適配問題。

2.因為原生程式碼都是java編寫,那麼有些沒有非空處理的,這種情況,需要kotlin接手,在宣告的方法和物件的時候就要注意。

3.先好好學習基礎吧。

這邊具體的踩坑就到這裡了。

還遺留著一些問題,我會逐步完善這個例子。

地址是元件化Gank(https://github.com/cangwang/Gank/tree/kotlin),歡迎大家star支援一下。

這一節介紹就到這裡,

下一節將會更精彩,敬請期待!!!

群號是316556016,也可以掃碼進群。我在這裡期待你們的加入!!

[Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)

相關文章