Kotlin在安卓中的一些tips

在本次谷歌IO大會上Kotlin終于轉正成為安卓官方語言。雖然每年都會出來一些編程語言,不過很多都小眾且容易消亡,但這次,由于Oracle和Google的在Java版權問題,以及Google的安卓生態圈保衛戰等原因,這次kotlin多半會真正上位,起碼在安卓開發方面,相信隨著Kotlin的完善和安卓生態圈的繼續成熟,java的使用將越來越少。

本文主要記錄自己學習Kotlin過程中卡住的一些技術點。

1-Kotlin實現Activity之間的跳轉

  • 這點其實挺無奈的,在網上找了半天也沒找到最直接準確的,說明資源還是挺缺的。記錄下,其實和java中還是比較像的。kotlin中,使用intent跳轉到其它activity
    其中,這里的activity都是kotlin activity:
var intent = Intent(this,SecondActivity::class.java);startActivity(intent)

當然若是使用anko庫的話,跳轉方式為:

startActivity<SecondActivity>(...可傳數據...)

2-Kotlin中匿名內部類

  • kotlin接口類似于java jdk8中的接口,具體用法就不介紹了。當使用接口回調時,傳參的匿名內部類的格式稍微復雜些,類似于靜態方法的定義,這里,kotlin中匿名內部類的表示為:
//.kt接口
interface ICallBack {
    fun getResult(age:Int)
}
//傳參, 匿名內部類
request.setCallBack(object :ICallBack{
     override fun getResult(age: Int) {
     }
 })

接上,不過匿名內部類在kotlin中使用并不多

3-Kotlin中擴展屬性和函數

  • 可以使用類似靜態導入的方式,給一個已存在但不易修改的類,動態的添加屬性和方法,這是比較牛的一個功能。記錄一下
//作為單例對象的類聲明
object Utils {
    fun Context.tos(msg: String) {
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    }

    val View.ctx:Context
    get() = context
}

== 給所有的activity中植入toast方法,靜態導入packgename.Utils.tos即可,調用tos().
== 在所有的設計view引用的地方植入直接調用屬性,內部實現還是調用的方法靜態導入packgename.Utils.ctx即可,使用方法view.ctx

4-Kotlin中函數參數,多參數的使用

很多教程和博客里基本只提到了單參數的函數作為參數,那個相對比較簡單,就不再贅述。這里只舉個多參數函數的用法,其實也很類似,但是記錄的博客并不多。
首先定義個請求類,有個函數作為參數,該函數需要兩個參數:

class Request2(var callListener:(String,Int) -> Unit) {
     fun run() {
        val readText = "from request2"
        callListener.invoke(readText,12345)
    }
}
假如有個btn點擊,完成邏輯,代碼如下:
btn_r1.setOnClickListener{
      Request2{text:String,length:Int->
       Log.e("flag--","(MainActivity.kt:27)-->>"+text+length);
       }.run()
}

此時上述回調里面的log日志便會打印出來。

5-兩個關鍵字:object和data
==data關鍵字,是顯示聲明該類是作為數據類使用,這一點在系統生成的toString()方法中比較容易有對比。沒有使用data的,toString()默認打印對象的內存地址;使用data關鍵字的,默認按照一定規則打印相關屬性。
==object關鍵字,語義是聲明一個對象,這個對象是類級別的,對比于java來說,定義這個類相當于定義了一個全局的單例對象。

6-兩個特殊函數:with和incline
==with函數目前比較明顯的作用是簡化對某個對象的調用。比如

//data類
data class Person(var name: String, var age: Int, var hobby: String) {
}
//使用
with(Person("小明", 29, "吃")) {
            Log.e("flag--", "(MainActivity.kt:29)-->>" + name)
            Log.e("flag--", "(MainActivity.kt:30)-->>" + age)
            Log.e("flag--", "(MainActivity.kt:31)-->>" + hobby)
        }
里面的name,age,hobby等默認是with后面的對象的,使用時就不用加前綴了。

==inline內聯函數目前比較明顯的作用是顯示的增加和控制行為。這個有些代理模式的味道,不如動態代理,但是由于函數參數的語法,使得復用性是比較高的。例子:

//內聯函數,本函數包含三個參數,一個str,一個num,一個函數參數,當隨機數小于5將會調用參數函數,
//函數參數接收str和num作為參數:
inline fun numSmaller5(str:String,nums:Int,code: (str: String, age: Int) -> Unit) {
        val nextInt = Random().nextInt(10)
        when (nextInt) {
            in 1..5 -> {
                code.invoke(str,nums)
            }
        }
    }
//使用,trywith是真正的執行函數
numSmaller5 ("小明",21){ text:String, num:Int -> tryWith(text,num) }

7-委托,和java中的橋聯模式比較像,假設一個對象有多個屬性和行為,其中某個行為有不同的實現方式,就可以考慮使用橋聯模式,將實現和抽象解耦。這里以委托的方式列下代碼。

//播放視頻的接口
interface IPlayVideo {
    fun play()
}
//聲明一個類,具有一個IPlayVideo屬性part,同時該類繼承于IPlayVideo,同時該類的play行為委托給part
class MobilePhone(part:IPlayVideo):IPlayVideo by part {
    fun call(contact:String){
        Log.e("flag--","(MobilePhone.kt:12)-->>call+$contact");
    }
}
//聲明一個IPlayVideo作為實現
class SurfaceView : IPlayVideo {
    override fun play() {
        Log.e("flag--", "(SurfaceView.kt:17)-->>by surface")
    }
}
//調用
 var phone = MobilePhone(SurfaceView())
            with(phone){
                play()
                 call("110")
            }
結果就是兩個log輸出

8-Kotlin中有一些很省事的函數,比如let,with和apply等。let-讓作為參數的函數執行,且返回參數函數的返回值;with-簡化了get等調用;apply-簡化了初始化對象的過程。這些函數用著都會使代碼顯得優雅和小巧。 而且其實現,也并不困難。這里我們也做個類似的函數,來體驗一把創造簡潔代碼的感覺。這里,就拿handler開刀吧。純為體驗,很多功能和細節并不考慮。--by CysionLiu
--handler大家很熟悉了,在使用時從創建,在子線程發送一個消息,再到主線程處理,最簡單的代碼量10行左右吧。但在這里用kotlin的語法稍微處理下。

//創建一個靜態函數,可復用
 inline fun <T> T.msg(msg:Message,crossinline f: (msg: Message) -> Unit): Unit {
        val handler =object : Handler(Looper.getMainLooper()) {
            override fun handleMessage(msg: Message?) {
                super.handleMessage(msg)
                f.invoke(msg!!)
            }
        }
        handler.sendMessage(msg)
    }
//然后在context環境中按如下方式調用。,一看就知道,調用代碼只有3行,還能及時處理消息,轉換線程。
Thread({msg(Message.obtain().apply {what = 880800}){
       msg->toast("消息--"+msg.what)
  }}).start()
//結果,主線程吐司:消息--880800

接上,其實java也可以寫個函數做,但代碼的簡潔,完全是來自于kotlin語法的靈活。

有關安卓開發方面的一般技術點和語法糖學習完成,以上是個人認為比較有代表性的一些。以后的Kotlin的學習和使用應該更傾向細節深入方面。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容

  • 前言 人生苦多,快來 Kotlin ,快速學習Kotlin! 什么是Kotlin? Kotlin 是種靜態類型編程...
    任半生囂狂閱讀 26,243評論 9 118
  • Google在今年的IO大會上宣布,將Android開發的官方語言更換為Kotlin,作為跟著Google玩兒An...
    藍灰_q閱讀 76,966評論 31 489
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,635評論 25 708
  • 隨著熱播劇三生三世十里桃花的播出,唐七抄襲也越來越多人知道,就是這個時候,我看到很多唐七粉罵原作者,我就郁悶了,唐...
    孤水行舟閱讀 991評論 0 0
  • 【村上春樹】 〖測試〗
    SY飛機閱讀 372評論 0 0