Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- NestedScrollView
- apk 빌드 과정
- 디자인 패턴
- 플로이드워셜
- 자이고트
- 운영체제
- 프로세스
- 안드로이드
- http발전과정
- Android
- Dispatchers
- GetX
- appcompatacitivity
- appcompatactivity
- 뷰홀더
- 내부 단편화
- 데코레이터 패턴
- 리사이클러뷰풀
- 절대 주소
- flutter
- 리사이클러뷰
- AsyncListDiffer
- 상태관리
- Kotlin
- AAC
- DiffUtil
- http 역사
- recyclerview
- 물리 메모리
- viewModelScope
Archives
- Today
- Total
hong's android
로컬 캐싱을 통한 로딩 시간 단축 본문
문제
앱을 실행할 때마다 홈 화면의 모든 시리즈 데이터들을 매번 서버에 요청해야 하므로 로딩 시간이 소요됩니다. 그리고 모든 시리즈 데이터들에 썸네일 URL 추가하는 데이터 가공 작업을 매번 거쳐야 했습니다.
이러한 과정들로 인해 로딩 시간이 길어진다면 이는 사용성에 불편함을 준다고 생각해 해당 문제를 개선하고자 했습니다.
해결
💡 어떻게 로딩 시간을 줄여야할까?
가공이 완료된 데이터들은 로컬에 캐시하고 이후엔 새롭게 추가된 데이터들만 서버에게 요청합니다. 그 후 해당 데이터들만 가공하고 로컬에 추가하는 것이 매번 불필요하게 반복되는 작업을 피하기 때문에 효율적이라고 생각했습니다.
첫 로딩 시 로컬에 데이터가 없을경우 시리즈 데이터들을 전부 초기화해주는 로직을 실행하고, 만약 로컬에 데이터가 존재할 경우 로딩이 완료된 날짜를 확인해서 해당 날짜 이후에 추가한 시리즈들만 가져오는 로직을 실행합니다.
로컬에 시리즈 데이터가 존재할 경우 업데이트를 실행하는 일부 로직 입니다. :)
// SplashViewModel.kt
private fun updateSeries() {
viewModelScope.launch {
val updateDate = userRepository.getLastUpdateDate()
val workerRequest = UpdateSeriesWorker.enqueue(workManager, updateDate!!)
val workInfo = workManager.getWorkInfoByIdLiveData(workerRequest.id).asFlow()
workInfo.collect {
if (it.state == WorkInfo.State.SUCCEEDED) {
userRepository.updateLastUpdateDate(Calendar.getInstance())
_isLoading.value = false
} else if (it.state == WorkInfo.State.FAILED) {
_isLoading.value = false
}
}
}
}
기존엔 앱 실행 시 마다 약 3초가 소요되었습니다. 변경 후 재실행을 할때마다 업데이트된 시리즈들만 가져오기 때문에 약 5~600ms가 소요되었습니다.
구현 화면
'Projects > TroubleShooting' 카테고리의 다른 글
스크롤 버벅거림을 일으킬 수 있는 중첩 리사이클러뷰의 뷰풀 개선 (0) | 2023.05.15 |
---|