LoginSignup
0
0

android(kotlin)で時刻を毎秒取得する方法

Posted at

はじめ

こちらのアプリをつく際に毎秒時刻を取得するのに手間取ったのでメモがてら書き綴っていこうかなと思います。

結論

ViewModel

    private val _data = MutableStateFlow(System.currentTimeMillis())
    val data:StateFlow<Long> = _data.asStateFlow()
    val formatter = SimpleDateFormat("MM/dd:HH:mm")
    val formattedTimer:StateFlow<String> = data.map {data ->
        formatter.format(data)
    }
    .stateIn(viewModelScope, SharingStarted.WhileSubscribed(),"")

    init {
        viewModelScope.launch {
            while (true){
                _data.value = System.currentTimeMillis()
                delay(1000)
            }
        }
    }
Activity
    viewModel.formattedTimer.collectAsState().value.let { formattedTimer ->
    ....
    }

かなり強引だし、init{}でviewModelが生成されてから終了されるまで1秒ごとに時刻を取得するわけですからメモリを食うし、画面が重い動きになるしでよくないのはわかっているのですが、このくらいしか思いつきませんでした。(´;ω;`)

失敗

viewModel
val data = MutableState(System.currentTimeMillis())
val formatter = SimpleDateFormat("MM/dd:HH:mm")
var Time = fomatter.format(data)

これは関数で囲んでいないのでviewModelが生成された一度きりだけ時刻を取得するので、失敗しました。
varにはしてみましたが、そもそも更新されないので変数にする意味が.....
今考えれば関数内でフィールド値を設定して、戻り値をTimeにすればよかったのでは?

改善

コードは上記の結論のコードと同じです。
以前に、学んだFlowをつかってAcitivityでcollectAsState()で変更されたときにviewModelから取得すればいいのではと思い実装してみました。
これのメリットとしては毎秒取得しているので、画面に現在の時刻を一秒刻みで出力したい方などはいいと思います。それ以外は重くなるのでお勧めしないかも....

終わり

以上になります。
質問や改善案など、参考になるものなどあれば是非教えてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0