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
- Tuist
- Swift Package Manager
- UIViewControllerTransitioningDelegate
- Android
- notifychanged
- List
- ViewBuilder
- base64 변환
- DataBinding
- convert base64
- 상단 탭바
- development language
- DevelopmentRegion
- 기존 앱
- transformation.map
- 개발자 면접
- url 관찰
- UIPresentationController
- detect url
- ios
- Side Menu
- swift #swift keychain #keychain 사용법
- swift
- scrolling tab
- pod install
- url 추적
- 스크롤 탭
- GeometryReader
- oberve url
- SwiftUI
Archives
- Today
- Total
버그 잡이
Retrofit + LiveData 네트워크 통신 로딩(Loading), 에러(Error) 표시하기 본문
Retrofit을 사용하면 네트워크 상황에 따라 데이터가 늦게 오는 경우(Loading)도 있고 못 오는 경우(Error)도 있다.
LiveData를 활용하면 간단한 코드로 이를 해결할 수 있다.
[순서]
1. status 변수(LiveData) 만들기
2. 네트워크 응답에 따라 status 값 정하기
3. status 변수 observe 하기.
1. status 변수 만들기
*ViewModel.kt
- enum class를 이용해서 상태 상수를 선언해주고
- status라는 변수를 LiveData로 만들어준다.
enum class BlogApiStatus{LOADING, ERROR, DONE}
private val _status = MutableLiveData<BlogApiStatus>()
val status: LiveData<BlogApiStatus>
get() = _status
2. 네트워크 응답에 따라 status 값 정하기
*ViewModel.kt
private fun getArticleList(){
coroutineScope.launch {
var getArticlesDeferred = BlogApi.retrofitService.getArticles()
try{
_status.value = BlogApiStatus.LOADING //기본 로딩 상태
var listResult = getArticlesDeferred.await()
_response.value = listResult.tistory.item.posts
_status.value = BlogApiStatus.DONE //성공시 완료 상태
}catch (t: Throwable){
//_response.value = "Failure: " + t.message
_status.value = BlogApiStatus.ERROR //에러시 에러 상태
}
}
}
3. fragment에서 status 변수 observe 하기
*BlogFragment.kt
viewModel.status.observe(this, Observer {
when(it){
BlogViewModel.BlogApiStatus.LOADING -> {
binding.statusText.setText("로딩중..")
binding.statusText.visibility = View.VISIBLE
}
BlogViewModel.BlogApiStatus.ERROR -> {
binding.statusText.setText("네트워크 에러")
binding.statusText.visibility = View.VISIBLE
}
BlogViewModel.BlogApiStatus.DONE -> {
binding.statusText.visibility = View.GONE
}
}
})
*fragment_blog.xml
<TextView
android:id="@+id/statusText"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="20sp"
android:gravity="center"
android:background="@color/colorPrimary"
android:visibility="invisible"
/>
- ImageView를 활용하면 더욱 직관적인 UI를 만들 수 있다.
*참고
https://www.youtube.com/watch?v=AObrHYaahlk&feature=emb_logo
반응형
Comments