配圖來自網(wǎng)絡(luò)样屠,如侵必刪
我們在開發(fā)當(dāng)中蛹找,可能會想著有沒有辦法進行數(shù)據(jù)和界面的解耦肚豺,這篇文章分享一下ViewModel
的使用實現(xiàn)數(shù)據(jù)與界面之間的解耦签赃,希望對看文章的小伙伴有所啟發(fā)谷异。
導(dǎo)入ViewModel的依賴
兼容Java和kotlin的依賴:
implementation('androidx.lifecycle:lifecycle-viewmodel:2.4.1')
僅生成kotlin的依賴:
implementation('androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1')
compose的依賴:
implementation('androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1')
代碼示例
1.創(chuàng)建一個繼承ViewModel
的類,我這里的命名是MyViewModel
import androidx.lifecycle.ViewModel
import java.util.*
class MyViewModel : ViewModel() {
private var timer: Timer? = null
var currentTime: Int = 0
var onTimerChangeListener: OnTimeChangeListener? = null
fun setOnTimeChangeListener(on:OnTimeChangeListener){
onTimerChangeListener = on
}
/**
* 開始倒計時
*/
fun startTimer() {
if (timer == null) {
timer = Timer()
val timerTask = object : TimerTask() {
override fun run() {
currentTime++
onTimerChangeListener?.onTimeChanged(currentTime)
}
}
timer?.schedule(timerTask, 1000, 1000)
}
}
interface OnTimeChangeListener {
fun onTimeChanged(s: Int)
}
override fun onCleared() {
super.onCleared()
timer?.cancel()
}
我們點擊進入ViewModel
類里面锦聊,我們會發(fā)現(xiàn)ViewModel
是一個抽象類歹嘹,里面只有一個onCleared()
方法,我們可以在這里面做釋放資源的操作孔庭。需要注意的是:
由于屏幕旋轉(zhuǎn)導(dǎo)致
Activity
重建荞下,不會調(diào)用ViewModel
的onCleared()
方法。
2.在Activity
中使用
import android.annotation.SuppressLint
import android.os.Bundle
import android.widget.TextView
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity(R.layout.activity_main) {
private val mMyViewModel:MyViewModel by viewModels()
@SuppressLint("UseCompatLoadingForDrawables")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mMyViewModel.setOnTimeChangeListener(object :MyViewModel.OnTimeChangeListener{
override fun onTimeChanged(s: Int) {
runOnUiThread {
findViewById<TextView>(R.id.currentTv).text = "當(dāng)前時間:${s}"
}
}
})
mMyViewModel.startTimer()
}
}