본문 바로가기

Android/Firebase

[FireBase] activate() 하는 과정에서 오류

728x90

문제.

Firebase에서 RemoteConfig를 통해 값을 가져오는데, fetch 후 원하는 값을 가져와 객체에 저장하고, activate를 통해 앱에서 사용하는 과정에서 오류가 발생.

 

firebaseRemoteConfig.fetch(time).addOnCompleteListener(activity, task -> {
	if (task.isSuccessful()) {
		firebaseRemoteConfig.activate();
        
        ...
        // 가져온 매개변수를 사용
	}
	
	...
	// 가져온 매개변수를 사용
	...
});

 

Firebase에서 가져온 값이 아닌, Default로 설정된 값들만 가져오는 문제가 발생하였다.

중단점을 걸어 확인해 보았을 때는 문제 없이 정상적인 값들을 사용하지만, 런타임시에만 오류가 재현되는 상황.

 

확인 결과.

https://firebase.google.com/docs/reference/android/com/google/firebase/remoteconfig/FirebaseRemoteConfig?hl=ko#activate()

activate()는 비동기로 동작하는 함수였기 때문에, activate() 이후 가져온 매개변수를 사용하는 부분에서 타이밍 문제가 발생하던 것이었다.

 

activate()는 비동기로 동작하기 때문에, activate()가 완료되고 난 후에 이후의 함수들이 수행되는 것을 보장하지 못한다. 따라서, activate()가 완료되기 전에 가져온 매개변수를 사용하려 했기 때문에 Default로 저장된 값들을 사용하게 되었던 것이고, 중단점을 걸어서 확인했을 때는 중단점에서 멈춰지기 때문에 activate()가 완료 되기까지의 시간이 확보되어 확인할 수 없었던 것.

 

 

해결 방법.

activate()가 완료된 후에 이후의 작업이 진행되는 것을 보장해 주어야 한다.

 

https://firebase.google.com/docs/reference/android/com/google/firebase/remoteconfig/FirebaseRemoteConfig?hl=ko#activate()

따라서, 위에서 설명되는 것 처럼 fetch 후 바로 활성화시키는 fetchAndActivate()를 사용한다.

 

firebaseRemoteConfig.fetchAndActivate().addOnCompleteListener(activity, task -> {
	if (task.isSuccessful()) {
        ...
        // 가져온 매개변수를 사용
	}
	
	...
	// 가져온 매개변수를 사용
	...
});

 

fetchAndActivate 또한 비동기로 동작하기는 하지만, fetch 후 activate까지 진행한 다음 successful 이벤트가 호출되기 때문에 비동기로 동작하지만 activate가 완료 된 후 다른 작업이 수행되는 것을 보장할 수 있다.

 

정리

Firebase 원격 구성에서 가져온 값을 비동기로 사용해도 문제가 없다면 activate()를 따로 선언해서 사용해도 문제 없지만,

Firebase 원격 구성에서 가져온 값을 바로 사용해야 하는 경우, 값을 가져오고 해당 동작 하는 것을 보장해주기 위해 fetchAndActivate를 사용하는 것이 편하다.

 


이번에 처리하는 방식으로 하면 이전에 작성했던 

 

 

https://heegs.tistory.com/8?category=785455

 

[FireBase] fetch 하는 과정에서의 오류

문제. 개발하던 도중, fetch 하는 과정에서 제대로 된 값이 들어오지 않아 앱이 죽는 오류가 발생. fetch는 제대로 완료(onComplete) 되지만, 저장되는 값 자체는 정상적이지 않는 값이 들어옴. 해결방��

heegs.tistory.com

와 같은 작업은 하지 않아도 될 것으로 보이지만,

Default 값을 세팅하는 과정은 앱의 안정성을 높이는데 중요한 역할을 하기 때문에 이 또한 적용시키는 것이 좋다.

728x90