kotlin学习笔记——扩展函数(anko)和网络请求
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                kotlin学习笔记——扩展函数(anko)和网络请求
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            anko是一個強大的庫,主要目的是替代以前xml的方式來使用代碼生成布局。除此之外,也包含了很多有幫助的函數和屬性。本章因為內容需要先介紹其中的擴展函數,其他的我們后面章節再來介紹。
 
anko的github地址https://github.com/Kotlin/anko
 
 
由于我們在Context上添加的這個擴展函數,那么他的子類都可以直接使用,比如在activity、fragment中,如 toast("test", 1000) toast("test") 在anko中已經包括了toast的擴展函數,與上面類似。anko提供了針對CharSequence和Resource的函數,還有兩個不同的toast和longToast方法,如: toast("test") longToast(R.string.test) 擴展函數也可以是一個屬性,例如(anko中也已經實現了): public var TextView.text: CharSequenceget() = getText()set(v) = setText(v) 擴展函數并不是真正的修改了一個類,而是以靜態導入的方式來實現的。擴展函數可以被聲明在任何文件中,因此最好將一系列有關的擴展函數定義在一個文件中。
 
 
uiThread依賴于調用者,如果它被一個activity調用,那么當activity.isFinishing()返回true,uiTread就不會調用,這樣就防止了崩潰。 假如你想使用Future(java中關于線程的一個接口,用于獲取結果)來工作,doAsync會返回一個Future。而如果你需要一個返回結果的Future,可以使用doAsyncResult。
                        
                        
                        1、擴展函數
擴展函數是在一個類上增加一種新的行為,甚至我們沒有這個類代碼的權限。擴展函數的優勢是它表現的像屬于這個類一樣,不需要傳入這個類的對象,而且可以使用this關鍵字和調用所有public方法。 一個例子,我們定義一個toast函數如下: fun Context.toast(msg: CharSequence, length: Int = Toast.LENGTH.LONG){Toast.makeText(this, msg, length).show }由于我們在Context上添加的這個擴展函數,那么他的子類都可以直接使用,比如在activity、fragment中,如 toast("test", 1000) toast("test") 在anko中已經包括了toast的擴展函數,與上面類似。anko提供了針對CharSequence和Resource的函數,還有兩個不同的toast和longToast方法,如: toast("test") longToast(R.string.test) 擴展函數也可以是一個屬性,例如(anko中也已經實現了): public var TextView.text: CharSequenceget() = getText()set(v) = setText(v) 擴展函數并不是真正的修改了一個類,而是以靜態導入的方式來實現的。擴展函數可以被聲明在任何文件中,因此最好將一系列有關的擴展函數定義在一個文件中。
2、請求
一、異步請求
kotlin提供一些擴展函數來使請求變得簡單,如: var text = URL(url).readText() 注意:readText不推薦結果很大的響應。 異步請求 在android中通常會使用AsyncTask,但使用時非常危險,因為運行到postExcute時,如果activity已經銷毀了就會崩潰。 anko提供了非常簡單的DSL來處理異步。doAsync函數(async函數已經棄用)用于在其他線程執行代碼;uiThread則在主線程執行代碼,如: doAsync{var text = URL(url).readText()Log.d(javaClass.simpleName, text)uiThread{toast("finish")} }uiThread依賴于調用者,如果它被一個activity調用,那么當activity.isFinishing()返回true,uiTread就不會調用,這樣就防止了崩潰。 假如你想使用Future(java中關于線程的一個接口,用于獲取結果)來工作,doAsync會返回一個Future。而如果你需要一個返回結果的Future,可以使用doAsyncResult。
二、數據類
1、定義一個數據類很簡單,如: data class Product(val date: Date, var price: Float, var detail: String) 數據類提供一些函數equals()、copy()、hashCode() 2、復制數據類 如果使用不可修改對象,如果要修改某個屬性必須新建一個對象,使用copy可以簡化,如: var p1 = Product(Date(), 27.5f, "tiny robot") var p2 = p1.copy(price = 30f) 這樣我們拷貝了一個對象同時修改了屬性值 3、映射數據類 多聲明既映射對象的每一個屬性到一個變量中,如: var p1 = Product(Date(), 27.5f, "tiny robot") var (date, price, detail) = p1 上面這個多聲明會被編譯成: var date = p1.compenent1() var price = p1.compenent2() var detail = p1.compenent3() 多聲明可以簡化代碼,比如在迭代一個map時: for((key, value) in map){Log.d("map", "key: $key value: $value") }三、json解析
json解析與java類似,定義好數據類,保證屬性名稱與json字段名稱一致即可(也可以用serialisedname) Gson().fromJson(jsonStr, Product::class.java)?
總結
以上是生活随笔為你收集整理的kotlin学习笔记——扩展函数(anko)和网络请求的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: kotlin学习笔记——类型、变量、属性
- 下一篇: kotlin集合操作符——总数操作符
