Android jetpack liveData 写一个定时器应用_android studio

他存在的作用就是viewModel 数据发生变化后 告知 页面中view

参考:​​2021年最全面的Jetpack系统学习课程,看他就够了,更新中_哔哩哔哩_bilibili​

package com.anguomob.jecpack.viewmodel

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class LiveDateViewModel : ViewModel() {


private lateinit var currentSecond: MutableLiveData<Int>

fun getCurrentSecond(): MutableLiveData<Int> {
if (::currentSecond.isInitialized.not()) {
currentSecond = MutableLiveData();
currentSecond.value = 0
}
return currentSecond
}
}

、布局非常简单

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.LiveDataActivity">

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

代码 就是通过监听数据变换 从而设置上去

而不是每次变化设置上去

package com.anguomob.jecpack.activity

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.anguomob.jecpack.R
import com.anguomob.jecpack.databinding.ActivityLiveDataBinding
import com.anguomob.jecpack.databinding.ActivityMainBinding
import com.anguomob.jecpack.viewmodel.LiveDateViewModel
import java.util.*

class LiveDataActivity : AppCompatActivity() {
lateinit var binding: ActivityLiveDataBinding
lateinit var viewModel: LiveDateViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLiveDataBinding.inflate(layoutInflater)
setContentView(binding.root)
viewModel =
ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application)).get(
LiveDateViewModel::class.java
)

binding.textView2.text = viewModel.getCurrentSecond().value.toString()

viewModel.getCurrentSecond().observe(this, { i ->
binding.textView2.text = viewModel.getCurrentSecond().value.toString()
})
startTimer()
}

private fun startTimer() {
//如果定时器开启过,则不再开启
if (viewModel.getCurrentSecond().value!! > 0) {
return
}

Timer().schedule(object : TimerTask() {
override fun run() {
//子线程更新数据使用postValue
viewModel.getCurrentSecond().postValue(viewModel.getCurrentSecond().value?.plus(1))
}
}, 1000, 1000);
}
}