인프런 커뮤니티 질문&답변

JI HUN LEE님의 프로필 이미지
JI HUN LEE

작성한 질문수

냉동코더의 알기 쉬운 Modern Android Development 입문

Practice7-세팅화면 구현하기 (Preferences DataStore, Enum)

자꾸 태클거는거 같아 죄송합니다 DataStore saveSortMode, getSortMode 함수 관련

해결된 질문

작성

·

242

2

Datastore 관련해서 Preferences Datastore와  ProtoDatastore 를 사용할때 함수를 호출할때  ui 스레드에서 호출해도 작업은 내부에서 Dispatcher.IO로 이동하여 처리하기 때문에

직접 withContext를 통해 Dispatchers.IO 로 변경해주지 않아도 될것같습니다 

반환값이 필요없는 경우엔 그냥 viewModelScope.launch() {}, 반환값이 반드시 필요할경우엔 viewModelScope.async..await() 혹은 withContext(viewModelScope.coroutineContext) 로 감싸서 호출하면 될거같습니다 

retrofit, room, datastore 까지 주로 쓰이는 네트워크 관련 작업이 모두 main-safe 되어있네요 ㄷ

참고)

https://developer.android.com/codelabs/android-preferences-datastore#3

New way of storing data in Android - Jetpack DataStore

 

 

답변 2

2

냉동코더님의 프로필 이미지
냉동코더
지식공유자

지적해주신것이 맞습니다.

다만 조금 해명아닌 해명을 하자면 제가 작년에 강의용 앱을 처음 만들때는 이렇게 디스패처를 굳이 바꿔주지 않으면 'Error: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.' 에러가 나서 작동을 하지 않았기 때문에 DB에 접근하는 viewmodelscope의 디스패처는 따로 IO로 설정할 필요가 있었습니다.

그런데 라이브러리 버전이 올라가면서 현재 room, datastore 등은 자동으로 디스패처를 전환하도록 변경된것 같은데 강의자료를 공개한 이후로 제가 그걸 확인하지 못했네요. 이렇게 라이브러리가 버전업되면서 API 사용법이 변경되는 경우도 많기 때문에 이런 부분을 꼼꼼하게 체크하시면 더 안정적인 앱을 만드실 수 있을 것 같습니다.

다른분들도 참고하시라고 Practice2C의 설명란에 내용을 추가했습니다. 다시한 번 알려주셔서 감사드립니다 :-)

1

JI HUN LEE님의 프로필 이미지
JI HUN LEE
질문자

앗 제가 retrofit 과 room, datastore 등의 라이브러리 변천과정을 모르고 처음부터 main-safe인것으로 알고있었네요..ㄷㄷ ㅠ  

retrofit + coroutine에 대해 공부할때

예전에 쓰인 블로그글이나 유튜브 강의등에서 retrofit를 사용할때 Dispatcher IO로 굳이 CoroutineContext를 변경해줬는지, room 을 사용할때도 그렇고

굳이 해주지 않아도 될 작업을 왜 해주는 것인가에 대한 의문을 가지고있었는데 그때는 그게 맞는 방법이었던거군요..

감사합니다! 

 

JI HUN LEE님의 프로필 이미지
JI HUN LEE

작성한 질문수

질문하기