adsl9002 2023-06-15 18:26 采纳率: 46.2%
浏览 28
已结题

viewModel更新时间

设置了3个textView分别显示时间,原本是想用开启线程的方式刷新时间,虽然代码少,但一直开启线程占用资源感觉不太好,如果这样用有什么弊端吗.

img

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>
  • 写回答

2条回答 默认 最新

  • 徐曙fia 2023-06-15 19:57
    关注

    1、一个LiveData就行了 设置成一个bean类;
    2、周、时间、日期用的不是同一时间的时间戳,虽然差别非常小,说不定就出问题了;
    3、建议使用ViewBinding就不用写findbyId了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月26日
  • 已采纳回答 6月18日
  • 创建了问题 6月15日

悬赏问题

  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路
  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错
  • ¥20 @microsoft/fetch-event-source 流式响应问题