kotlin学习笔记之扩展函数(anko)和网络请求

Kotlin学习笔记系列:http://blog.csdn.net/column/details/16696.html

anko是一个强大的库,主要目的是替代以前xml的方式来使用代码生成布局。除此之外,也包含了很多有帮助的函数和属性。本章因为内容需要先介绍其中的扩展函数,其他的我们后面章节再来介绍。
anko的github地址https://github.com/Kotlin/anko


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: CharSequence  
     get() = 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)和网络请求)