Android LiveData PostValue , setValue 회고

Assist·2023년 11월 8일
0

Android

목록 보기
1/24

안녕하세요 오랜만입니다.
최근에 너무 바빠서 글을 못썼네요. 그럼 오늘은 제가 프로젝트를 하면서 겪은 일을 써보려고 합니다.

android LiveData

이전에 F-Lab에서 프로젝트를 하면 postValue 만을 쓰는것에 지적을 받은적이 있습니다

멘토님 : PostValue 만 쓰는 이유가 있나요?
Assist : 딱히 이유는 없습니다. 그저 PostValue만 써봐서 그렇습니다 

멘토님은 liveData에서 PostValue 와 SetValue 을 알맞은 상황에 쓰는 것을 추천했습니다.

자 그럼 이 두개의 차이는 무엇일까요?

setValue , PostValue 의 차이

이 두개의 차이점은 아주 간단합니다.
setValue 은 Main Thread 을 사용하여 동기적으로 데이터를 View에 전달합니다.
PostValue은 background Thread을 사용하여 비동기적으로 데이터를 View에 전달합니다.

그래서 setValue 경우 background Thread 을 사용하는 환경에 두면 바로 runtime error 가 뜹니다.

data -> Flow 

viewModelScope.launch {
	data.collect {
    	livedata.value = it
    }    
에러 예시 입니다.

그럼 어떻게 써야 하는데?

뭐 가장 중요한건 자기 스타일 대로 쓰는 것이지만 저의 예시를 알려 드리겠습니다.

가정 : Device에서 동작시 데이터를 보냄 
가정 : 앱의 설정값이 변할때 모든 데이터에 영향이 가야함 

이게 제가 겪은 상황입니다.
요즘 LiveData의 예시 코드를 볼때 항상 seald class 혹은 seald interface을 사용하여
분기 처리 하여 하나의 LiveData을 사용 하더라구요

그럼 하나의 LiveData 을 사용하면 뭐가 문제이냐

만약 함수를 절차적으로 실행해 데이터를 받는다면 문제가 없겠지요
근데 저의 가정중 첫번째 Device에서 동작시 데이터가 옴

이것때문에 PostValue 가 setValue 때문에 최신 데이터을 반환하는데 문제가 생길수 있습니다.

그래서 전 이렇게 사용했습니다.

1. 절차적으로 사용하는 livedata은 setValue 
2. 비동기 적으로 사용하는 livedata은 따로 생성해 postValue 

이런식으로 사용하여 두 livedata의 값은 영향을 안가게 설계 했습니다.

private var _liveDataSetValue = MutableLiveData<String>() 
val liveDataSetValue : LiveData<String> get() = _liveDataSetValue

private var _liveDataPostValue = MutableLiveData<String>() 
val liveDataPostValue : LiveData<String> get() = _liveDataPostValue

더 좋은 방법이 있으시면 댓글 달아주시면 감사하겠습니다.

그럼 오늘도 읽어주셔서 감사합니다
-피드백와 비판은 언제나 환영입니다-

profile
안드로이드만 좋아하는 특이한 개발자

0개의 댓글

관련 채용 정보