๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค2024 ์•ˆ๋“œ๋กœ์ด๋“œ/โ˜€๏ธ ํ•˜๊ณ„ ์ธํ„ด ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ ๊ธฐ๋ก

10์ฃผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

by hyeonha 2024. 12. 17.

๋ชฉ์ฐจ

    9/2

    ์—…๋ฌด ๋‚ด์šฉ

    • ๊ณ ๊ฐ์‚ฌ ์ธก์˜ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ ๋‚ด์šฉ ๊ฒ€ํ†  ๋ฐ ์ž๋ฃŒ ์ •๋ฆฌ
    • ๋””์ž์ด๋„ˆ๋ถ„๊ป˜ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ ๋‚ด์šฉ ์ž๋ฃŒ ์ „๋‹ฌ ํ›„ ์ถ”๊ฐ€๋œ ํ™”๋ฉด ๋””์ž์ธ ์š”์ฒญ
    • ์‹ฌ๋ฐ•์ˆ˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฝ”๋“œ ์ถ”๊ฐ€
      • ์ธก์ •๋˜๋Š” ์‹ฌ๋ฐ•์ˆ˜๋ฅผ ํ™”๋ฉด์— ๋ณด์ด๊ฒŒ ํ•˜๊ณ 
      • ์„ค์ •๋œ ์ฃผ๊ธฐ์— ๋”ฐ๋ผ ํ™”๋ฉด์— ๋ณด์ด๋Š” ์‹ฌ๋ฐ•์ˆ˜ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ๊ตฌํ˜„
      • ํ˜„์žฌ๋Š” ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋กœ์ง ํ™•์ธ
    • ์‹ฌ๋ฐ•์ˆ˜ ์ž…๋ ฅ ํ™”๋ฉด ์ถ”๊ฐ€
      • numpicker ๋ฅผ ํ†ตํ•ด ์‹ฌ๋ฐ•์ˆ˜ ์ˆ˜์น˜ ์ž…๋ ฅ
      • ์ด ๋•Œ ์ˆ˜์˜ ๋‹จ์œ„๋Š” 10์œผ๋กœ ์„ค์ •
      • *displayedValues* ๋ฅผ ํ†ตํ•ด numpicker์—์„œ ๋ณด์—ฌ์ค„ ์ˆ˜ ์กฐ์ ˆ ๊ฐ€๋Šฅ
        • minValue์™€ maxValue๋Š” ์ธ๋ฑ์Šค ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ„
    • ์‹ฌ๋ฐ•์ˆ˜ ์ž…๋ ฅ ํ›„ ์‹ฌ๋ฐ•์ˆ˜ ๋กœ์ปฌ ์ €์žฅ ์ถ”๊ฐ€
    • PreferenceUtil.setDangerHeart(this@HeartRateActivity,displayedValues[binding.dangerHeart.value])
    • ์ด์ƒ ์‹ฌ๋ฐ•์ˆ˜ ๊ฐ์ง€ ์ฝ”๋“œ ์ถ”๊ฐ€
      • ์‹ฌ๋ฐ•์ˆ˜ ์ธก์ • ์‹œ ์ด์ƒ ์‹ฌ๋ฐ•์ˆ˜๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์กฐ๊ฑด๋ฌธ ์ถ”๊ฐ€

    9/3

    1. ๊ธฐ์กด ํ™ˆํ™”๋ฉด ๋ฌธ์ œ ํ•ด๊ฒฐ
      • ๊ธฐ์กด : ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก ์ค‘์ด๊ฑฐ๋‚˜ ์ค‘์ง€์ƒํƒœ์ธ ์ƒํ™ฉ์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•จ
      • ํ˜„์žฌ : ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก ์ค‘์ด๊ฑฐ๋‚˜ ์ค‘์ง€์ƒํƒœ์ธ ์ƒํ™ฉ์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์˜
        • StateFlow ๋ณ€์ˆ˜ ์ด์šฉ
    2. ์‹ฌ๋ฐ•์ˆ˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ broadcastreceiver ๋ฐฉ์‹ ๋Œ€์‹  livedata๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ–ˆ์Œ
      • ๋”ฐ๋ผ์„œ ์„œ๋น„์Šค ๋‚ด์— livedata๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์ €์žฅ ํ›„
      • ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ์„œ๋น„์Šค๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์ฃผ๊ณ 
      • ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ์„œ๋น„์Šค์˜ livedata ๋ณ€์ˆ˜๋ฅผ ๊ด€์ฐฐํ•˜์—ฌ UI ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์˜€๋‹ค.
      • ์ด์ƒ ์‹ฌ๋ฐ•์ˆ˜ ์ข…๋ฅ˜ (warn, danger) ์„ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋น„์Šค์—์„œ WARN, DANGER ๋ฌธ์ž์—ด์„ ๋„˜๊ฒจ์ค€ ํ›„ ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ๊ฐ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€ ๋„์›Œ์คŒ
    • ์ตœ์ข… : livedata๋กœ์ง → flow๋กœ ๋ณ€๊ฒฝ

    ์ถ”๊ฐ€๋œ ์š”๊ตฌ์‚ฌํ•ญ ์ •๋ฆฌ

    • ์‹ฌ๋ฐ•์ˆ˜ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ธฐ
    • IP ์ฃผ์†Œ ์ž…๋ ฅ ํ›„ ์‹ฌ๋ฐ• ๋ฒ”์œ„๋ฅผ ์ž…๋ ฅํ•ด์„œ ์š”์ฒญํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€
      • ์œ„ํ—˜, ๊ฒฝ๊ณ  ์ •์ƒ ๊ธฐ์ค€๊ฐ’๋“ค ์ž…๋ ฅ ํ›„ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ
        • ์œ„ํ—˜, ๊ฒฝ๊ณ ๋กœ ํŒ๋‹จํ•  ์‹ฌ๋ฐ•์ˆ˜ ์ž…๋ ฅ ํ•„์š”
      • ์ž…๋ ฅ ํ›„ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ
    • ๋ฐ์ดํ„ฐ ์ธก์ • ๋„์ค‘ ์„ค์ •ํ•œ ์‹ฌ๋ฐ•์ˆ˜๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ์ˆ˜์น˜๊ฐ€ ๊ธฐ๋ก๋˜๋ฉด ์›Œ์น˜ + ์›น์—์„œ ์•Œ๋žŒ ๊ธฐ๋Šฅ ๋™์ž‘
    • ๊ธฐ์ค€ ์‹ฌ๋ฐ•์ˆ˜๋Š” db์—์„œ ์กฐํšŒํ•˜์—ฌ ์ž…๋ ฅ๋œ ๊ธฐ์ค€ ์‹ฌ๋ฐ•์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ํŒ๋‹จ

    ๊ทผ๋กœ์ž ์ถ”๋ฝ ๋ฐ ์“ฐ๋Ÿฌ์ง ๊ฐ์ง€

    • ๊ทผ๋กœ์ž ์ถ”๋ฝ ๋ฐ ์“ฐ๋Ÿฌ์ง ๊ฐ์ง€ ๋กœ์ง ์ถ”๊ฐ€
    • ๋ฐœ์ƒ ์‹œ ์›Œ์น˜์™€ ์•ฑ์—์„œ ์•Œ๋ฆผ ๊ธฐ๋Šฅ ๋™์ž‘

    ์ด์ƒ ์‹ฌ๋ฐ•์ˆ˜ ๊ฐ์ง€ 

    • ์ด์ƒ ์‹ฌ๋ฐ•์ˆ˜ ๊ฐ์ง€๋ฅผ ์œ„ํ•œ ์‹ฌ๋ฐ•์ˆ˜ ์ž…๋ ฅ ๋ ˆ์ด์•„์›ƒ ์ถ”๊ฐ€
    • ์ž…๋ ฅ๋œ ์‹ฌ๋ฐ•์ˆ˜ (์ •์ƒ, ์œ„ํ—˜, ๊ฒฝ๊ณ )๋ฅผ ๋กœ์ปฌ db์— ์ €์žฅํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€

      binding.btnComplete.setOnClickListener {
                CoroutineScope(Dispatchers.IO).launch {
                                    PreferenceUtil.setDangerHeart(this@HeartRateActivity,binding.dangerHeart.value.toString())
                    PreferenceUtil.setWarnHeart(this@HeartRateActivity,binding.warnNumber.value.toString())
                    PreferenceUtil.setNormalHeart(this@HeartRateActivity,binding.normalHeart.value.toString())

     

    ๋ฐ”๋กœ number picker์˜ value๋ฅผ ์ €์žฅํ•  ๋•Œ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์‹ฌ๋ฐ•์ˆ˜ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค๊ฐ€ ์ €์žฅ๋œ๋‹ค.

     

    ๊ทธ๋Ÿฌ๋‚˜ ์‹ฌ๋ฐ•์ˆ˜ ๊ฐ’์ด ์ €์žฅ๋œ ๋ฆฌ์ŠคํŠธ์— ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•œ ํ›„ ์–ป์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค€ ๊ฒฐ๊ณผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž˜ ์ €์žฅ๋˜์—ˆ๋‹ค.

     

     binding.btnComplete.setOnClickListener {
                CoroutineScope(Dispatchers.IO).launch {
    
                    // ์‹ฌ๋ฐ•์ˆ˜ ์ €์žฅ ๋กœ์ง
                    PreferenceUtil.setDangerHeart(this@HeartRateActivity,displayedValues[binding.dangerHeart.value])
                    PreferenceUtil.setNormalHeart(this@HeartRateActivity,displayedValues[binding.normalHeart.value])
                    PreferenceUtil.setWarnHeart(this@HeartRateActivity,displayedValues[binding.warnNumber.value])
                }
            }

     

     Sensor.TYPE_HEART_RATE ->{
                    val heartRate = event.values[0].toInt()
                    heartrateData.add(heartRate)
                    // todo : ์‹ฌ๋ฐ•์ˆ˜ ์ด์ƒ ๋กœ์ง ์ถ”๊ฐ€
    
                    val normalHeart = PreferenceUtil.getNormalHeart(this)
                    val warnHeart = PreferenceUtil.getWarnHeart(this)
                    val dangerHeart = PreferenceUtil.getDangerHeart(this)
    
                    Log.d("normalheart", normalHeart!!.toInt().toString())
                    if (heartRate ==0) {
                        Log.d("์‚๋น…"," ์‹ฌ๋ฐ•์ˆ˜๊ฐ€ 0 : ์ธก์ • ์˜ค๋ฅ˜ /์œ„ํ—˜")
                    }
                    if (heartRate < normalHeart.toInt()) {
                        Log.d("์‚๋น…"," ์‹ฌ๋ฐ•์ˆ˜ < ์ •์ƒ")
                    }
                     if(heartRate >= dangerHeart!!.toInt()) {
                        Log.d("์‚๋น…"," ์‹ฌ๋ฐ•์ˆ˜ >= ์ •์ƒ")
                    }
                     if(heartRate >= warnHeart!!.toInt() && heartRate < dangerHeart.toInt()) {
                        Log.d("์‚๋น…"," ๊ฒฝ๊ณ  <= ์‹ฌ๋ฐ•์ˆ˜ < ์œ„ํ—˜ ")
                    }
                     if (heartRate >= normalHeart.toInt() && heartRate < warnHeart.toInt()) {
                        Log.d("์‚๋น…"," ์ •์ƒ <= ์‹ฌ๋ฐ•์ˆ˜ < ๊ฒฝ๊ณ  ")
                    }
                    else {
                        Log.d("์ •์ƒ์ด์šฉ","์ •์ƒ์ ์œผ๋กœ ์ธก์ • ์ค‘")
                    }
                }

    else if๋กœ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ์กฐ๊ฑด๋ฌธ ์•ˆ์˜ ๋กœ๊ทธ ์‹คํ–‰๋˜์ง€ ์•Š์Œ if๋กœ ๋ฐ”๊ฟ”์ฃผ๋‹ˆ๊นŒ ๋กœ๊ทธ ์ฐํž˜

     

    9/3

    1. ๊ธฐ์กด ํ™ˆํ™”๋ฉด ๋ฌธ์ œ ํ•ด๊ฒฐ
      • ๊ธฐ์กด : ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก ์ค‘์ด๊ฑฐ๋‚˜ ์ค‘์ง€์ƒํƒœ์ธ ์ƒํ™ฉ์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•จ
      • ํ˜„์žฌ : ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก ์ค‘์ด๊ฑฐ๋‚˜ ์ค‘์ง€์ƒํƒœ์ธ ์ƒํ™ฉ์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์˜
        • StateFlow ๋ณ€์ˆ˜ ์ด์šฉ
    2. ์‹ฌ๋ฐ•์ˆ˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ broadcastreceiver ๋ฐฉ์‹ ๋Œ€์‹  livedata๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ–ˆ์Œ
      • ๋”ฐ๋ผ์„œ ์„œ๋น„์Šค ๋‚ด์— livedata๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์ €์žฅ ํ›„
      • ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ์„œ๋น„์Šค๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์ฃผ๊ณ 
      • ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ์„œ๋น„์Šค์˜ livedata ๋ณ€์ˆ˜๋ฅผ ๊ด€์ฐฐํ•˜์—ฌ UI ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์˜€๋‹ค.
      • ์ด์ƒ ์‹ฌ๋ฐ•์ˆ˜ ์ข…๋ฅ˜ (warn, danger) ์„ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋น„์Šค์—์„œ WARN, DANGER ๋ฌธ์ž์—ด์„ ๋„˜๊ฒจ์ค€ ํ›„ ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ๊ฐ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€ ๋„์›Œ์คŒ
    • ์ตœ์ข… : livedata๋กœ์ง → flow๋กœ ๋ณ€๊ฒฝ

    9/4

    • ์‹ฌ๋ฐ•์ˆ˜ ์ž…๋ ฅ
      • ํ™”๋ฉด ์ ์šฉ
      • ์‹ฌ๋ฐ•์ˆ˜ ์ž…๋ ฅ ์š”๊ตฌ ์‚ฌํ•ญ ๊ตฌํ˜„
        • ์Šคํฌ๋กค ์‹œ ๊ฒฝ๊ณ  ์‹ฌ๋ฐ•์ˆ˜, ์ •์ƒ ์‹ฌ๋ฐ•์ˆ˜, ์œ„ํ—˜ ์‹ฌ๋ฐ•์ˆ˜๋กœ ์ „ํ™˜
        • ์‹ฌ๋ฐ•์ˆ˜ ํƒ€์ž… ์ „ํ™˜ ์‹œ ํ˜„์žฌ ์„ค์ •๋œ ์‹ฌ๋ฐ•์ˆ˜ ์ˆ˜์น˜๋ฅผ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ €์žฅ
        • ์‹ฌ๋ฐ•์ˆ˜ ์ˆ˜์น˜๊ฐ€ ๋ชจ๋‘ ํด๋ž˜์Šค ๋‚ด ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์—ˆ์„ ๊ฒฝ์šฐ ๋‹ค์‹œ ์‹ฌ๋ฐ•์ˆ˜ ํƒ€์ž… ๋ณ€๊ฒฝ ์‹œ ์ €์žฅ๋œ ์ˆ˜์น˜ ๋ณด์ด๊ธฐ
        • ์™„๋ฃŒ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋กœ์ปฌ db์— ํ•ด๋‹น ๊ฐ’ ์ €์žฅ
    • ์‹ค์ œ ๊ธฐ๊ธฐ์—์„œ ์‹ฌ๋ฐ•์ˆ˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฝ”๋“œ ํ™•์ธ ๋ฐ apk ํŒŒ์ผ ์ „๋‹ฌ
    • ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •(์‹ฌ๋ฐ•์ˆ˜ ์ด์ƒ ๊ฐ์ง€, ๊ทผ๋กœ์ž ์ด์ƒ ๊ฐ์ง€)
    • ์‹ค์ œ ๊ธฐ๊ธฐ์—์„œ ์ด์ƒ ์‹ฌ๋ฐ•์ˆ˜ ์•Œ๋ฆผ ํ™•์ธ
    • ์‹ค์ œ ๊ธฐ๊ธฐ์—์„œ ์ถ”๋ฝ ๊ฐ์ง€ ํ™•์ธ
      • ์ถ”๊ฐ€ : ๊ทผ๋กœ์ž์˜ ์ถ”๋ฝ์„ ๊ฐ์ง€ํ•˜๊ธฐ์— ํšจ์œจ์ ์ธ์ง€ ํ™•์ธ ํ•„์š”
      • ์›Œ์น˜๋ฅผ ์ƒํ•˜ ์ขŒ์šฐ๋กœ ํ”๋“ค๋ฉฐ ๊ฐ์ง€ ํ™•์ธ

    • ๋™์‹œ ์ˆ˜์ • ์˜ˆ์™ธ

    • ํ™”๋ฉด์— UI๊ฐ€ ๋ณด์ด์ง€ ์•Š์„ ๋•Œ์—๋Š” ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ flow ์ˆ˜์ง‘์„ ์ค‘๋‹จํ•˜์ž (์‹ฌ๋ฐ•์ˆ˜ ๋ชจ๋‹ˆํ„ฐ๋ง, ์ด์ƒ ์‹ฌ๋ฐ•์ˆ˜, ์ถ”๋ฝ ๊ฐ์ง€)
     // ๊ธฐ์กด 
            override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
                val sensorBinder = service as SensorForegroundService.SensorBinder
                sensorService = sensorBinder.getService()
                sensorBound = true
    
                lifecycleScope.launch {
                    sensorService.heartRateStateFlow.collect { heartRate ->
                        binding.heartRateText.text = heartRate.toString()
                    }
                }
    
                lifecycleScope.launch {
                    sensorService.fallAlertStateFlow.collect {
                        if (it) showDialog("๊ทผ๋กœ์ž ์ด์ƒ ๊ฐ์ง€")
                    }
                }
    
    
                lifecycleScope.launch {
                    sensorService.heartRateAlertStateFlow.collect { heartAlert ->
                        when (heartAlert) {
                            "WARN", "DANGER" -> showDialog("์‹ฌ๋ฐ•์ˆ˜ ์ด์ƒ ๊ฐ์ง€")
                        }
    
                    }
                }
                lifecycleScope.launch{
                    sensorService.heartRateRunning.collect {
                        if (!it) {
                            binding.heartRateText.text = "๋ฐ์ดํ„ฐ ์ „์†ก ์ค‘์ง€"
                            binding.locationText.text = "๋ฐ์ดํ„ฐ ์ „์†ก ์ค‘์ง€"
                        } else {
                            binding.locationText.text = "๋ฐ์ดํ„ฐ ์ „์†ก ์ค‘"
                        }
    
                    }
    
                }
            }

    lifecycleScope.launch ๋‚ด๋ถ€์—์„œ ๋ฐ”๋กœ flow ๋ฐ์ดํ„ฐ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ!!

    ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์•ฑ์ด ์œ„์น˜ํ•ด๋„ flow์—์„œ ์ˆ˜์ง‘์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.

     

    ์ด ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด์„œ๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ํ™”๋ฉด์— ๋ณด์ผ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” onStart์—์„œ ์ˆ˜์ง‘์„ ์‹œ์ž‘ํ•˜๊ณ  ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์งˆ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” onStop์—์„œ ์ˆ˜์ง‘์„ ์ค‘๋‹จํ•ด์•ผํ•œ๋‹ค.

     

    ์ด ์ผ์„ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฒƒ์ด repeatOnLifecycler!!!

    //์ˆ˜์ •
                lifecycleScope.launch {
                    repeatOnLifecycle(Lifecycle.State.STARTED){
                        launch {
                            sensorService.heartRateStateFlow.collect { heartRate ->
                                /*
                                    ์—…๋ฐ์ดํŠธ๋˜๋Š” ์‹œ๊ฐ„ ํ™•์ธํ•˜๊ธฐ
                                     */
                                Log.d("์‹ฌ๋ฐ•์ˆ˜ ์—…๋Žƒ ", heartRate.toString())
                                binding.heartRateText.text = heartRate.toString()
                            }
                        }
    
                        launch {
                            sensorService.fallAlertStateFlow.collect {
                                if (it) showDialog("๊ทผ๋กœ์ž ์ด์ƒ ๊ฐ์ง€")
                            }
                        }
    
                        launch {
                            sensorService.heartRateAlertStateFlow.collect { heartAlert ->
                                when (heartAlert) {
                                    "WARN", "DANGER" -> showDialog("์‹ฌ๋ฐ•์ˆ˜ ์ด์ƒ ๊ฐ์ง€")
                                }
    
                            }
                        }
                        launch {
                            sensorService.heartRateRunning.collect {
                                if (!it) {
                                    binding.heartRateText.text = "๋ฐ์ดํ„ฐ ์ „์†ก ์ค‘์ง€"
                                    binding.locationText.text = "๋ฐ์ดํ„ฐ ์ „์†ก ์ค‘์ง€"
                                } else {
                                    binding.locationText.text = "๋ฐ์ดํ„ฐ ์ „์†ก ์ค‘"
                                }
    
                            }
                        }
    
    
                    }
    
                }

     

    flow๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ๋•Œ ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์ˆ˜์ง‘๋˜์–ด์•ผํ•˜๋Š”๊ฐ€?

    ์‚ฌ์‹ค ํ™”๋ฉด์— UI๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ๋•Œ๋Š” flow์—์„œ ์ˆ˜์ง‘์„ ์ค‘๋‹จํ•ด์•ผํ•œ๋‹ค.

     

    1. .asLiveData() ๋ฅผ ํ†ตํ•ด flow๋ฅผ LiveData๋กœ ๋ณ€ํ™˜ํ•ด์„œ UI๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š”๋™์•ˆ์—๋งŒ ์•„์ดํ…œ์„ ๊ด€์ฐฐ

    2. repeatOnLifeCycle ์„ ํ†ตํ•ด ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ธ์‹ํ•˜์—ฌ ์ˆ˜๋ช…์ฃผ๊ธฐ๊ฐ€ ํ•ด๋‹นํ•˜๋Š” ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋ฉด ๋ธ”๋ก์„ ์ „๋‹ฌํ•  ์ƒˆ๋กœ์šด ์ฝ”๋ฃจํ‹ด์„ ์ž๋™์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ํ•ด๋‹น ์ˆ˜๋ช… ์ฃผ๊ธฐ ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๋ฉด ์ทจ์†Œํ•œ๋‹ค.

    3. ์—ฌ๋Ÿฌ ๊ฐœ์˜ flow๋ฅผ ์ˆ˜์ง‘ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ(์‹ฌ๋ฐ•์ˆ˜ , ์ด์ƒ ์‹ฌ๋ฐ•์ˆ˜ ์—ฌ๋ถ€, ์ถ”๋ฝ ์—ฌ๋ถ€ ๋“ฑ) repeatOnLifeCycle ๋ธ”๋ก์—์„œ launch๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ฝ”๋ฃจํ‹ด ์ƒ์„ฑ ๊ฐ€๋Šฅ!!

    728x90