设置了3个textView分别显示时间,原本是想用开启线程的方式刷新时间,虽然代码少,但一直开启线程占用资源感觉不太好,如果这样用有什么弊端吗.
class MainActivity : FragmentActivity() {
private lateinit var timeChangeReceiver: TimeChangeReceiver
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val updateText = 1
val handler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
when (msg.what) {
1 -> {
val current = LocalDateTime.now()
val dateView: TextView = findViewById(R.id.dateView)
val clockView: TextView = findViewById(R.id.clockView)
val weekView: TextView = findViewById(R.id.weekView)
val clockFormatter = DateTimeFormatter.ofPattern("HH:mm")
val clockTime = current.format(clockFormatter)
val dateFormatter = DateTimeFormatter.ofPattern("MM-dd")
val dataTime = current.format(dateFormatter)
val weekFormatter = DateTimeFormatter.ofPattern("E")
val weekTime = current.format(weekFormatter)
dateView.text = dataTime
clockView.text = clockTime
weekView.text = weekTime.replace("周", "星期")
}
else -> {
}
}
}
}
thread {
do {
Thread.sleep(1000)
val msg = Message()
msg.what = updateText
handler.sendMessage(msg)
} while (true)
}
然后觉得用viewModel观察广播的时间变化来更新时间也可以,刚学代码也是东拼西凑,不知道这样写是否合理,还有没有简化代码的地方.
MainViewModel.kt
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
class MainViewModel : ViewModel() {
val clock: LiveData<String>
get() = _clock
val date: LiveData<String>
get() = _date
val week: LiveData<String>
get() = _week
private val _clock = MutableLiveData<String>()
private val _date = MutableLiveData<String>()
private val _week = MutableLiveData<String>()
init {
_clock.value = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("HH:mm"))
_date.value = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("MM-dd"))
_week.value = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("E"))
.replace("周", "星期")
}
fun dateTime() {
val dateFormatter = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("MM/dd"))
val clockFormatter = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("HH:mm"))
val weekFormatter = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("E")).replace("周", "星期")
_week.value = weekFormatter
_date.value = dateFormatter
_clock.value = clockFormatter
}
}
MainActivity.kt
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModelProvider
class MainActivity : FragmentActivity() {
private lateinit var timeChangeReceiver: TimeChangeReceiver
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intentFilter = IntentFilter()
intentFilter.addAction("android.intent.action.TIME_TICK")
timeChangeReceiver = TimeChangeReceiver()
registerReceiver(timeChangeReceiver, intentFilter)
val clockView: TextView = findViewById(R.id.clockView)
val dateView: TextView = findViewById(R.id.dateView)
val weekView: TextView = findViewById(R.id.weekView)
viewModel = ViewModelProvider(this)[MainViewModel::class.java]
viewModel.clock.observe(this) {current ->
clockView.text = current
}
viewModel.date.observe(this) {current ->
dateView.text = current
}
viewModel.week.observe(this) {current ->
weekView.text = current
}
val btn: Button = findViewById(R.id.btn1)
btn.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
}
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(timeChangeReceiver)
}
inner class TimeChangeReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
viewModel.dateTime()
}
}
}
activity_main
<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=".MainActivity">
<TextView
android:id="@+id/clockView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="27dp"
android:layout_marginEnd="27dp"
android:hint="当前时间"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/dateView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="27dp"
android:layout_marginEnd="16dp"
android:gravity="center_horizontal"
android:hint="日期"
android:textSize="15sp"
app:layout_constraintEnd_toStartOf="@id/clockView"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/weekView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:hint="星期"
android:textSize="15sp"
app:layout_constraintEnd_toStartOf="@id/clockView"
app:layout_constraintTop_toBottomOf="@id/dateView" />
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="27dp"
android:text="btn1"
android:textAllCaps="false"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/appBtn"/>
</androidx.constraintlayout.widget.ConstraintLayout>