前言
如何安裝Kotlin可以參考Kotlin學(xué)習(xí)(一): Kotlin插件安裝這篇文章。
demo說明
該demo是使用Kotlin寫的登錄demo,使用MVP模式,里面用到了Retrofit+RxJava,然后用了Mob的登錄Api接口作為登錄和注冊(cè)的判斷,Mob提供了很多免費(fèi)的接口。

Activity
直接將控件的id當(dāng)成變量來使用

設(shè)置點(diǎn)擊事件
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("正在注冊(cè)...")
dialog?.setCancelable(false)
dialog?.show()
loginPresenter?.register(username.text.toString(), password.text.toString(), email.text.toString())
}
}
}
注意:直接使用id作為變量的時(shí)候,要在Module的gradle里面加入擴(kuò)展,才能使用,不然會(huì)報(bào)錯(cuò)
apply plugin: 'kotlin-android-extensions'
Retrofit+RxJava
Retrofit結(jié)合RxJava能快捷的使用網(wǎng)絡(luò)請(qǐng)求。
創(chuàng)建Service接口,Kotlin的類型是寫在后面
interface RetrofitService {
/**
* 注冊(cè)
* key 用戶申請(qǐng)的appkey
* username 用戶名(一個(gè)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 用戶申請(qǐng)的appkey
* username 用戶名
* password 用戶密碼
*/
@GET("login")
fun userLogin(
@Query("username") username: String,
@Query("password") password: String,
@Query("key") key: String = Constant.KEY
): Observable<LoginResponse>
}
創(chuàng)建Retrofit,使用伴生對(duì)象創(chuàng)建,類型靜態(tài)變量使用
class RetrofitUtils<T> {
companion object {
/**
* 創(chuàng)建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結(jié)合RxJava
RetrofitUtils
.retrofitService
.userLogin(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
...
})
使用對(duì)象聲明
在寫項(xiàng)目的時(shí)候,一般會(huì)將常量統(tǒng)一寫到一個(gè)類里面,然后設(shè)置靜態(tài)變量,由于在Kotlin中不存在靜態(tài)變量,所有就有對(duì)象聲明的存在,對(duì)象聲明比較常用的地方就是在這里,對(duì)象聲明用Objcet關(guān)鍵字表示。
object Constant {
/**
* baseUrl
*/
val REQUEST_BASE_URL = "http://apicloud.mob.com/user/"
val KEY = "1be865c0e67e3"
}
使用的時(shí)候直接類名加.加變量名,如Constant.REQUEST_BASE_URL
使用數(shù)據(jù)類
前面說過,Kotlin的慣用語法是有寫POJO類,一般寫那種類都是用data修飾的類,也就是數(shù)據(jù)類表示,只保存數(shù)據(jù)的類(JavaBean)。
data class LoginResponse(val msg: String, val result: LoginResultResponse, val retCode: String)
使用擴(kuò)展函數(shù)
fun loge(tag: String, content: String?) {
Log.e(tag, content ?: tag)
}
調(diào)用的時(shí)候直接使用loge(TAG, "content")
后話
Kotlin寫起來非常方便,里面的非空(non-null)可以避免空指針異常等等的好處,本demo的代碼放到github,歡迎stars和issues。