์ธ์ฆ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฌธ์๋ฅผ ์ฌ์ฉ์์๊ฒ ์ ์ก ์์ฒญํ๋ ์๋ฒ api๋ฅผ ํธ์ถํ๊ณ 2๋ถ ๋์ ์ธ์ฆ๋ฒํธ ์ฌ๋ฐ๊ธ์ ๋ง๋ ํ์ด๋จธ์ ๊ตฌํ์ ํด์ผ ํ๋ค.
ํ์ด๋จธ ๊ตฌํ์ ์ฒ์์ด๋ผ์ ๊ณ ๋ฏผ์ ๋ง์ด ํ๋ค. CountDownTimer๋ฅผ ์ธ๊น, ์๋น์ค๋ฅผ ์ฌ์ฉํ ๊น...
์ ๋ฐฐ๋๊ป ์ฌ์ญค๋ดค๋๋ CountDownTimer์ ์๋น์ค๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฑ ํ๋ก์ธ์ค๊ฐ ๋ ๋ผ๊ฐ๋ ๊ฒฝ์ฐ์๋ ์ฌ๊ณ ์๋ ์๊ฐ๋ ๋ ๋ผ๊ฐ๋ค๊ณ ์๋ ค์ฃผ์ จ๋ค. SharedPreferences๋ฅผ ์จ์ ํ๋ฉด์ ์ง์ ํ๊ณ ๋๊ฐ ๋๋ง๋ค ์๊ฐ์ ๊ธฐ๋กํ๋ ๊ฒ์ ์ฐ๊ณ , ์ฝ๋ฃจํด์ ์ฐ๋ฉด ์ฝ๋ค๊ณ ์๋ ค์ฃผ์ จ๋ค. ๋๋ฌด ๋น์ฐํ ๊ฑธ ๋ชฐ๋๋๋ ์ ๋ฐฐ๋์ ํ์ ์ ๋ณด๊ณ ๐ณ ๋ฐ์ฑํฉ๋๋ค๐ ์ ํ๋ก์ธ์ค๊ฐ ๋ ๋ผ๊ฐ๋ ๊ฒฝ์ฐ๋ ์๊ฐ์ ๋ชปํ๊ฑฐ์ผ
๊ทธ ๋ค๋ก ์์ ์ ์ฌ์ ๋ค. ์ฌ๋ฌ ๊ฐ๋ฐ์๋ค์ ์์ ๊ฝค๋ ํ ์ด ์ฑ์ ์ฝ๋๋ SharedPrefernces๋ฅผ ์ฝ๊ฒ ์ธ ์ ์๋ ์ ํธ๋ฆฌํฐ ์ฝ๋ ๋ชจ์์ด ์์ด์ ๊ฐ์ ธ๋ค๊ฐ ์ฐ๋ฉด ๋๋ค.
ํ์ด๋จธ ๋ด๋น ๊ฐ์ฒด
//SharedPrefereneces๋ก ์๊ฐ ์ ๋ณด์ ์ ๊ทผํ๋ ๊ฐ์ฒด
object CodeTimer {
const val duration : Long = 2* 60 * 1000
// ์ ์ฅ๋ ์๊ฐ์ 0์ผ๋ก ์ ์ฅํ๋ค.
fun reset() {
//SharedPreferences๋ฅผ ํตํด 0์ผ๋ก ์๊ฐ์ ์ ์ฅ
...
}
// ํ์ด๋จธ ์์ ์๊ฐ์ ์ ์ฅ
fun setRequestTime(time:Long) {
//SharedPreferences๋ฅผ ํตํด ์์ ์๊ฐ์ ์ ์ฅ
...
}
// ๋จ์ ์๊ฐ์ ๋ฐํ
fun getRemainTime() : Long {
val currentTime = System.currentTimeMillies()
val requestTime = //SharedPreferences๋ก ํ์ด๋จธ ์์ ์๊ฐ ๊ฐ์ ธ์ด
val remainTime = duration - (currentTime - requestTime)
return when(remainTime > 0L) {
true -> remainTime
false -> {
reset()
0L
}
}
}
}
๋ทฐ๋ชจ๋ธ์์ ์ฌ์ฉ
class TimerViewModel : ViewModel() {
private val _timeText = MutableLiveData<String>()
val timeText : LiveData<String> = _timeText
private var timeJob : Job? = null
...
fun countDonw() {
timberJob = viewModelScope.launch {
var remainTime = CodeTimer.getRemainTime()
var millisUntilFinished = if(remainTime == 0L) {
CodeTimer.setRequestTime(System.currentTimeMillis())
CodeTimer.duration
} else remainTime
while(millisUntilFinished > 0) {
val second = milliesUntilFinished / 1000 % 60
val minutes = millisUnitlFinished / (1000 * 60) / 60
_timeText.value = getTimeString(minutes, second)
delay(1000L)
millisUntilFinished -= 1000L
}
_timeText.value = getTimeString(0, 0)
setTimeout()
}
}
fun stopCountDown() {
timerJob?.cancel()
}
...
}