-
[Android][Firestore] Firestore 호출 응답 기다리기안드로이드/트러블 슈팅 2022. 11. 23. 00:34
나는 firestore에서 데이터를 호출하는데 callback 방식을 사용하지 않고 그 응답에 대응하기위해 다음과 같은 코드를 작성했다
suspend fun callAllKeyword(): String?{ var resultString: String? = null val firestoreAsync = CoroutineScope(Dispatchers.Default).async { firestore.collection("keywords").get() .addOnSuccessListener { result -> result.documents.forEach { resultString += it.data?.toString() } Log.d("FIRESTORE_CALL_KEYWORD", "callAllKeyword: sucess") } .addOnFailureListener { Log.d("FIRESTORE_CALL_KEYWORD", "callAllKeyword: fail") } } firestoreAsync.await() return resultString.also { Log.d("FIRESTORE_CALL_KEYWORD", "return: ") } }
(log 떡칠은 무시해주세요...)
하지만 예상 동작과는 다르게 return이 먼저 동작해버렸다.
아마도 firestore.collection("keywords").get() 이 그냥 반환을 해버리고 그 뒤의 동작들은 또 비동기적으로 돌아가는 것 같았다.
(확실하진 않습니다 공부중이라...)
async 말고 runblocking 으로도 감싸봤는데 소용없었다. (코루틴 공부 좀 열심히 할껄...)
수 시간의 검색결과 찾은 해답
firestore.collection("keywords").get() .addOnSuccessListener { result -> result.documents.forEach { resultString += it.id Log.d("FIRESTORE_CALL_KEYWORD", "callAllKeyword: sucess data : ${it.id}") } Log.d("FIRESTORE_CALL_KEYWORD", "callAllKeyword: sucess end") } .addOnFailureListener { Log.d("FIRESTORE_CALL_KEYWORD", "callAllKeyword: fail") }.await()
그냥 끝에 await 를 붙일 수 있었다...
'안드로이드 > 트러블 슈팅' 카테고리의 다른 글
[Android] 코틀린 엘비스 연산자(?:)의 잘못된 사용법 (0) 2024.01.08 [Android][View] view의 리스너는 해당 동작으로 발생하는 상태변화 이후에 실행된다. (0) 2022.11.29 [android][style,theme] theme.xml 에서 style 만들어도 적용 안될때 (0) 2022.11.24