前言
如何安装Kotlin可以参考Kotlin学习(一): Kotlin插件安装这篇文章。
demo说明
该demo是使用Kotlin写的登录demo,使用MVP模式,里面用到了Retrofit+RxJava,然后用了Mob的登录Api接口作为登录和注册的判断,Mob提供了很多免费的接口。
Activity
直接将控件的id
当成变量来使用
设置点击事件
login.setOnClickListener(this)
register.setOnClickListener(this)
用when
代替switch
override 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
里面加入扩展,才能使用,不然会报错
apply plugin: 'kotlin-android-extensions'
Retrofit+RxJava
Retrofit
结合RxJava
能快捷的使用网络请求。
创建Service
接口,Kotlin的类型是写在后面
interface RetrofitService {
/**
* 注册
* key 用户申请的appkey
* username 用户名(一个key只能存在唯一username)
* password 用户密码(建议加密)
* email 邮箱
*/
@GET("rigister")
fun userRegister(
@Query("username") username: String,
@Query("password") password: String,
@Query("email") email: String,
@Query("key") key: String = Constant.KEY
): Observable<RegisterResponse>
/**
* 登录
* key 用户申请的appkey
* username 用户名
* password 用户密码
*/
@GET("login")
fun userLogin(
@Query("username") username: String,
@Query("password") password: String,
@Query("key") key: String = Constant.KEY
): Observable<LoginResponse>
}
创建Retrofit
,使用伴生对象创建,类型静态变量使用
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
RetrofitUtils
.retrofitService
.userLogin(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
...
})
使用对象声明
在写项目的时候,一般会将常量统一写到一个类里面,然后设置静态变量,由于在Kotlin中不存在静态变量,所有就有对象声明的存在,对象声明比较常用的地方就是在这里,对象声明用Objcet
关键字表示。
object Constant {
/**
* baseUrl
*/
val REQUEST_BASE_URL = "http://apicloud.mob.com/user/"
val KEY = "1be865c0e67e3"
}
使用的时候直接类名加.
加变量名,如Constant.REQUEST_BASE_URL
使用数据类
前面说过,Kotlin的惯用语法是有写POJO类,一般写那种类都是用data
修饰的类,也就是数据类表示,只保存数据的类(JavaBean
)。
data class LoginResponse(val msg: String, val result: LoginResultResponse, val retCode: String)
使用扩展函数
fun loge(tag: String, content: String?) {
Log.e(tag, content ?: tag)
}
调用的时候直接使用loge(TAG, "content")
后话
Kotlin写起来非常方便,里面的非空(non-null)可以避免空指针异常等等的好处,本demo的代码放到github,欢迎stars
和issues
。