前言
如何安装Kotlin可以参考Kotlin学习(一): Kotlin插件安装这篇文章。
demo说明
该demo是使用Kotlin写的登录demo,使用MVP模式,里面用到了Retrofit+RxJava,然后用了Mob的登录Api接口作为登录和注册的判断,Mob提供了很多免费的接口。
Activity
直接将控件的id
当成变量来使用
设置点击事件1
2login.setOnClickListener(this)
register.setOnClickListener(this)
用when
代替switch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20override fun onClick(v: View?) {
when (v?.id) {
R.id.login ->
if (checkContent(true)) {
dialog = SweetAlertDialog(this, SweetAlertDialog.PROGRESS_TYPE)
.setTitleText("正在登录...")
dialog?.setCancelable(false)
dialog?.show()
loginPresenter?.login(username.text.toString(), password.text.toString())
}
R.id.register ->
if (checkContent(false)) {
dialog = SweetAlertDialog(this, SweetAlertDialog.PROGRESS_TYPE)
.setTitleText("正在注册...")
dialog?.setCancelable(false)
dialog?.show()
loginPresenter?.register(username.text.toString(), password.text.toString(), email.text.toString())
}
}
}
注意:直接使用id
作为变量的时候,要在Module
的gradle
里面加入扩展,才能使用,不然会报错1
apply plugin: 'kotlin-android-extensions'
Retrofit+RxJava
Retrofit
结合RxJava
能快捷的使用网络请求。
创建Service
接口,Kotlin的类型是写在后面1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31interface RetrofitService {
/**
* 注册
* key 用户申请的appkey
* username 用户名(一个key只能存在唯一username)
* password 用户密码(建议加密)
* email 邮箱
*/
fun userRegister(
String, username:
String, password:
String, email:
String = Constant.KEY key:
): Observable<RegisterResponse>
/**
* 登录
* key 用户申请的appkey
* username 用户名
* password 用户密码
*/
fun userLogin(
String, username:
String, password:
String = Constant.KEY key:
): Observable<LoginResponse>
}
创建Retrofit
,使用伴生对象创建,类型静态变量使用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class RetrofitUtils<T> {
companion object {
/**
* 创建Retrofit
*/
fun create(url: String): Retrofit {
...
return Retrofit.Builder()
.baseUrl(url)
.client(okHttpClientBuilder.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}
val retrofitService: RetrofitService = RetrofitUtils.getService(Constant.REQUEST_BASE_URL, RetrofitService::class.java)
/**
* 获取ServiceApi
*/
fun <T> getService(url: String, service: Class<T>): T {
return create(url).create(service)
}
}
}
Retrofit
结合RxJava
1
2
3
4
5
6
7
8
9RetrofitUtils
.retrofitService
.userLogin(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
...
})
使用对象声明
在写项目的时候,一般会将常量统一写到一个类里面,然后设置静态变量,由于在Kotlin中不存在静态变量,所有就有对象声明的存在,对象声明比较常用的地方就是在这里,对象声明用Objcet
关键字表示。1
2
3
4
5
6
7
8object Constant {
/**
* baseUrl
*/
val REQUEST_BASE_URL = "http://apicloud.mob.com/user/"
val KEY = "1be865c0e67e3"
}
使用的时候直接类名加.
加变量名,如Constant.REQUEST_BASE_URL
使用数据类
前面说过,Kotlin的惯用语法是有写POJO类,一般写那种类都是用data
修饰的类,也就是数据类表示,只保存数据的类(JavaBean
)。1
data class LoginResponse(val msg: String, val result: LoginResultResponse, val retCode: String)
使用扩展函数
1 |
|
调用的时候直接使用loge(TAG, "content")
后话
Kotlin写起来非常方便,里面的非空(non-null)可以避免空指针异常等等的好处,本demo的代码放到github,欢迎stars
和issues
。