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,Kotlin学习笔记)