前言
從來不寫博客的我刀诬,突然也想記錄一下生活(zhuang bi)咽扇,于是有了這篇開篇博客??。如果覺得對(duì)你有幫助陕壹,請(qǐng)多多支持质欲。雖然kotlin出來有一段時(shí)間了,我也是剛正式將kotlin作為Android開發(fā)第一語言使用糠馆,所以有什么不規(guī)范的地方希望各位大佬們能指出嘶伟。本篇教程適用于有點(diǎn)基礎(chǔ)的小白。
kotlin
什么是kotlin又碌?kotlin簡而言之就是一門基于jvm的編程語言和java兼容九昧,但是比java更強(qiáng)大绊袋,而且大大減少你的代碼,提高開發(fā)效率铸鹰。
Mvp
mvp開發(fā)模式已經(jīng)不是什么新鮮的技術(shù)癌别,或者說它也不能說是一門技術(shù)。我的理解它就是讓代碼更加規(guī)范的一種編程風(fēng)格掉奄。便于管理和開發(fā)规个,最主要的作用還是用于解耦凤薛。由于本篇是教大家如何用Kotlin快速搭建一個(gè)Android項(xiàng)目姓建,所以對(duì)于一些mvp的概念和kotlin的使用不會(huì)做詳細(xì)的介紹。
目錄結(jié)構(gòu)
以上是我的分包缤苫,這是一個(gè)Demo速兔,實(shí)際項(xiàng)目還是得按具體情況具體分析。
Base基類
BaseModle
interface BaseModle {
//TODO:modle里相關(guān)操作
}
BaseView
BaseView
interface BaseView{
//TODO:view里相關(guān)操作
}
BasePresenter
abstract class BasePresenter<V : BaseView> {
var view: WeakReference<V>? = null
fun bindView(view: V) {
this.view = WeakReference(view)
}
fun isBind(): Boolean {
return view != null && view!!.get() != null
}
fun unBindView() {
if (isBind()) {
view!!.clear()
view = null
}
}
fun obtainView(): V? {
return if (isBind()) view!!.get() else null
}
}
其實(shí)和Java抽取mvp基類大同小異活玲,具體問題具體分析涣狗,在接口中根據(jù)實(shí)際情況定義方法。
上面實(shí)現(xiàn)了modle舒憾,view镀钓,presenter的基類,我們?cè)谑褂脮r(shí)只需繼承即可镀迂。
Example:
MainContract
interface MainContract {
interface IView : BaseView {
//TODO:...
}
interface IModle : BaseModle {
//TODO:...
}
abstract class IPresenter : BasePresenter<IView>() {
//TODO:...
}
}
MainModle
class MainModle : MainContract.IModle {
//TODO:...
}
MainPresenter
class MainPresenter : MainContract.IPresenter() {
init {
var modle: MainContract.IModle = MainModle()
var view: MainContract.IView = obtainView()!!
}
}
接下來就是Activity的抽取丁溅,這個(gè)只是一個(gè)示例,具體情況還需具體分析
BaseActivity
abstract class BaseActivity<V : BaseView, P : BasePresenter<V>> : AppCompatActivity() {
var presenter: P? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getResLayoutId())
presenter = initPresenter()
presenter!!.bindView(this as V)
initView()
initAction()
doMoreThings()
}
/**其他操作**/
abstract fun doMoreThings()
/**獲取布局資源**/
abstract fun getResLayoutId(): Int
/**獲取控件**/
abstract fun initView()
/**設(shè)置監(jiān)聽**/
abstract fun initAction()
/**初始化presenter**/
abstract fun initPresenter(): P
/**可觸摸時(shí)執(zhí)行的操作**/
abstract fun doOnResume()
override fun onResume() {
super.onResume()
doOnResume()
}
override fun onDestroy() {
super.onDestroy()
presenter!!.unBindView()
}
}
使用時(shí)只需繼承即可
class MainActivity : BaseActivity<MainContract.IView, MainPresenter>(), MainContract.IView {
override fun doMoreThings() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getResLayoutId(): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun initView() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun initAction() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun initPresenter(): MainPresenter {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun doOnResume() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
上面給出了Activity的一種抽取方式探遵,F(xiàn)ragment大同小異窟赏,就不給出了。
結(jié)語
至此使用Kotlin搭建一個(gè)簡單的mvp就已經(jīng)完成了箱季,其他業(yè)務(wù)邏輯根據(jù)實(shí)際情況向接口中添加涯穷。本人也剛加入kotlin開發(fā),至此還有很多細(xì)節(jié)沒有注意藏雏,歡迎大家吐槽??????