你們好,我係蒼王。
html
如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。java
[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表android
相信你們都有看過今年的Google I/O,估計對咱們Android程序員來講,應該是最重磅的消息是Google要將Kotlin做爲Android開發的第一語言,而且說Android studio3.0將自動兼容Kotlin的開發。git
而後,次日這種關於Kotlin的推文和教程在你的朋友圈瘋傳。而後你以爲如今的研發流程很好,爲什麼要改呢?有點對新技術的小抵觸,你的Android技術圖譜裏面又要增添同樣的學習內容。程序員
工具在進步,語言在進步,固然人也要跟着進步。github
而後,就想把本身的Gank工程用kotlin武裝一下吧。
swift
藉着近來大熱的Kotlin,讓個人組件化Gank爆一波吧。android-studio
前兩年就有接觸過kotlin,寫了一下,發現本身連kotlin的handler也寫不出(學習成本有時真的挺高的)。須要瞭解一下kotlin的特性,而後我花了三天的時間將個人Gank從java轉成了Kotlin,裏面踩到的坑,真的有時候讓人以爲無語了,這裏就跟你們說一下,我在此次轉換中遇到一些什麼狗血的問題吧。安全
說一下Kotlin的配置。app
咱們的Kotlin安裝須要安裝Plugin,其能夠兼容Android studio2.0多以上的版本。
而後如今的版本是1.1.2-7版本。
確定大夥關注的都知道,可使用Android Studio3.0的預覽版了,我事先踩了一下坑,發現Android Studio直接轉編譯個人Gank組件化的工程,發現編譯出來的包,根本安裝都失敗。(Are you kidding me?)這坑真的蠻大的。。。
因此提醒你們Android Studio3.0有勇氣去先踩坑的能夠去考慮,我搞了兩個鍾,仍是沒法編譯成功,仍是等版本把這巨坑fix吧。
Kotlin其實已經發布了兩年多,可是仍是沒有國內仍是像swift同樣,沒有給予太大的關注,究竟推行如何,最好仍是要太Google有多大的決心要替換Kotlin爲主語言了。
配置其實很簡單,咱們在Tools->Kotlin->Configure Kotlin inProject能夠找到配置路徑。
而後須要選擇須要配置的module,有勇氣固然是全module啦。
而後他將會幫你配置最新的1.1.2-7的版本到depencies裏面
而後還會在每一個工程裏面給你引入kotlin-android,結果第一個坑來了。詐一看,這應該沒有什麼問題啊,然而馬上配置不經過。。。
由於這裏裏面com.android.xxx的必定要先引入的。kotlin-android必定要比它後引入,否則報錯,本身慢慢找調試臺資料吧。
而後它會在每一個module的dependencies裏面引入kotlin-stdlib,這裏一開始會引入kotlin-stdlib-jre的版本的。以後會在這裏介紹會有什麼坑。
那就開始咱們的轉換之旅了
這裏能夠選擇一次過轉換所有的工程文件。可是通常來講咱們只須要轉src裏面的java文件。而有一些文件轉換是會讓工程出現卡死現象。我就有某個工程出現了,因此我暫時先越過它,等之後知道緣由再作轉換。
****2017.5.24****
這裏有個很是方便的東西,若是你直接將java代碼粘貼到kotlin文件裏面,kotlin會很友好提示咱們是否要將代碼轉爲kotlin編寫,這樣大大增長咱們的效率。
而後我找到了代碼轉換失敗的緣由了,是由於Handler轉化問題。若是代碼存在Handler,java轉化爲kotlin的時候很大程度會出現假死的問題。
(1)View沒有引入
原本Android工程應該默認引入View包
這裏每每是你使用了View的一些屬性沒有引入進去。
(2)值判空問題
其實很簡單,其須要對象爲非空,而你告訴她如今你的對象有可能爲空,kotlin的提示機制仍是很安全的。
這裏仍是先判空吧,否則用兩個!!,崩了就自找麻煩了。
(3)值轉換問題
這裏咱們不能有些自定義View的屬性,最好仍是要檢查一下,是否沒聲明或者轉換的時候出現錯誤。
這裏轉爲float值就能夠了。
(4)關聯module轉換的時候,轉換引用的時候會漏掉某些屬性
例如BaseActivity 放在base module,其餘module引用到,而後先聲明轉換一個module的時候,會發現引用只會聲明爲protected
這裏換爲override就沒問題了
(5)列表轉換問題
這裏會轉ArrayList,kotlin會將其轉換爲MutableList
然而由於咱們日常轉換輸入的時候是List的對象,那麼咱們就須要強轉爲MutableList
接下來是噁心的databinding問題
咱們kotlin配置databinding,除了要配置通常的databinding之外,
還須要配置kapt
引入kapt的庫
(6)kapt的編譯問題
很明顯是compileReleaseKotlin和kaptReleaseKotlin衝突了
這邊暫時可行的方法是,下降kotlin的版本,如今的是1.1.2-7而咱們下降到1.1.2或者1.1.2-3(親測沒問題)
(7)沒法生成databinding文件
好吧,這裏介紹一個方法,你們認真認真的看Gradle Console的調試版,會告訴你某些屬性存在問題的。
(8)這裏是還有巨坑,給你提示自定義Application的問題。
其實問題徹底不是由於這個Application的問題,
看調試版找到真正緣由
這裏就是應爲遇到DataBindingAdapter找不到app:imageurl的對象引發的,爲什麼會找不到。
由於個人ImageLoader是放在了base module裏面,沒有加入kapt的引用,因此其編譯索引不會索引到。
這裏面還須要注意必定生成app的主 module也須要加入kapt的引用,否則連app都沒法生成成功。
(9)test沒有加入kapt編譯
咱們能夠看到咱們通常生成工程的時候,會加入test的文件夾和引用
由於以前引用的是java的測試庫,而kotlin須要它特有的測試庫,那麼咱們須要更換其編譯庫。
解決的相關地址Stackoverflow
(10)單例問題
單例轉換如今都沒法作到徹底的轉換成功的,由於單例寫法比較複雜,因此轉換很容易會出問題。
我用的是double check的單例
很明顯用的伴生對象,而後經過get的方法來聲明我要獲取的CommonRetrofit的對象。
關於kotlin的教學,推薦一下騰訊裏面有一個kotlin的基礎教程,很是建議,說得也很清晰。
個人單例問題解決是參照這上面的教程。
****2017.5.24****
Handler問題,由於直接轉換Handler和Runnable會假死。
這裏給你們一些編寫的提示,若是循環用handler調用runnable,Handler須要先經過object實例化。
這樣寫是不能經過的。咱們須要將其轉換爲更加這個對象聲明調用爲自身,這樣才能正常運用。
這個有點小糾結了一下。
(11)路由跳轉
我使用的是ARouter,提示沒法找到route matched。
頗有多是kapt註解暫時沒法支持生成路由RouteMatch文件。
暫時這邊只能換爲隱式跳轉。
(12)遇到Adapter數據問題
相信你們都遇到過Fragment顯示而後才加載數據方法。
而後咱們會在setUserVisiblehint中更新
然而咱們的RecylerView裏面的數據對象
顯示這裏爲空
不明真相的時候覺得這樣初始化的沒問題的。
然而咱們重點是須要datas的對象初始化,這纔是正確的初始化,這樣纔不爲null,size才能正常返回。
(13)BindingAdapter問題
告知咱們沒法找到ImageLoader的loadImage方法。由於沒法其不是static屬性的。
而後咱們加上JvmStatic註解,說的是java中的static屬性。
(14)DataBindingAdapter無空提示
咋一看沒什麼問題
由於這裏由於databinding的關係,其通過xml的關聯,因此其沒法知道xml傳遞過來的數據是否有空的狀況。
而後這裏由於Gank返回回來的圖片的url地址有可能爲空,而我沒有給予聲明,那麼接下來就會報爲空值的錯誤了。
一個問號能解決的事情啊。
(15)WebView的onPageStart的問題
連原生的onPageStated接口的都是有兼容問題的,因此你還想信愛情嗎?並且原生是調用java編寫的,更加沒法提示錯誤。
看起來很正常,其實這裏裏面是favicon這個參數問題
仍是一個問號能夠解決的問題啊
原生是沒有非空的提示的,因此有些原生方法的調用,還地本身修改接口,你們要當心。
搞了三天終於從坑裏跳出來了,而後感受本身對kotlin的瞭解更加深刻。
1.出現問題,必定要認真看調試版,可能調試版信息kapt衝突可能都不是真正緣由,可能只是xml等適配問題。
2.由於原生代碼都是java編寫,那麼有些沒有非空處理的,這種狀況,須要kotlin接手,在聲明的方法和對象的時候就要注意。
3.先好好學習基礎吧。
這邊具體的踩坑就到這裏了。
還遺留着一些問題,我會逐步完善這個例子。
地址是組件化Gank(https://github.com/cangwang/Gank/tree/kotlin),歡迎你們star支持一下。
這一節介紹就到這裏,
下一節將會更精彩,敬請期待!!!
羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!