前言
如何安裝Kotlin可以參考Kotlin學習(一): Kotlin插件安裝這篇文章。
demo說明
該demo是使用Kotlin寫的登錄demo,使用MVP模式,里面用到了Retrofit+RxJava,然后用了Mob的登錄Api接口作為登錄和注冊的判斷,Mob提供了很多免費的接口。
demo界面
Activity
直接將控件的id
當成變量來使用
xml
設置點擊事件
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
。