DodoNehir / FindShelter2

nagivation drawer를 사용한 findshelter
0 stars 0 forks source link

:pushpin: findshelter

무더위 쉼터 위치 찾기

1. 제작 기간 & 참여 인원


2. 사용 언어, 라이브러리, API


3. 핵심 기능

이 서비스는 무더위 쉼터로 지정된 곳을 지도 위에 표시합니다.
앱을 실행하면 내 위치에 대한 위도와 경도, 주소를 알게 됩니다. 그리고 사용자가 쉼터 종류 중 하나를 선택하면 그에 맞는 쉼터의 위치를 찾아서 지도에 표시합니다.


4. 구현 방법


        homeViewModel.isLocationInitialized.observe(viewLifecycleOwner) { initialized ->
            if (initialized) {
                var latitude = lastKnownLocation.latitude.toString()
                var longitude = lastKnownLocation.longitude.toString()
                homeViewModel.fetchData("${latitude},${longitude}", equptype)
            }
        }


    fun fetchData() {

        viewModelScope.launch {
            repository.getAddressWithResult() ...

            repository.getCode() ...

            // DB get
            val location = repository.getLocation(areaCode.toString(), equpType)
            if (location == null) {
                callShelterRequest()
            } else {
                getLocationFromDB(location.id)
            }

            requestUpdateMap()
        }

    }


/ SettingsViewModel 에서 값을 쓸 수 있도록 제공한 메서드 / val EQUPTYPE = stringPreferencesKey("equptype") fun updateEquptype(context: Context, selectedEquptype: String) { viewModelScope.launch { context.dataStore.edit { settings -> settings[EQUPTYPE] = selectedEquptype } } }

/ 값 읽기 / val EQUPTYPE = stringPreferencesKey("equptype") lifecycleScope.launch { equptype = requireContext().dataStore.data.first()[EQUPTYPE].toString() }



</br>

## 5. 주요 문제점과 해결법 & 개선점
1.
- 문제점: 매번 쉼터 위치를 request함으로 api요청 횟수를 낭비하게 되고 한 번에 많은 양을 요청하면 timeout 에러가 발생함
- 원인: request 후 데이터를 저장하지 않음
- 해결법: Room을 사용해서 한 번 request한 정보는 저장하도록 변경함

2. 앱을 배포하려면 우선 FastAPI가 로컬이 아니라 외부에서도 접속 가능하도록 해야 한다. 무료 서버 호스팅 찾기.

3.
- 문제점: 로컬 DB나 네트워크 통신을 할 때는 메인 스레드가 아니라 백그라운드에서 실행되어야 하는데, 코루틴이 2개가 만들어지고 있음
- 원인: 두 개의 Fragment 에서 코루틴이 사용되고 있기 때문에 한 곳에서의 코루틴이 사라지지 않아서 발생한다고 예상됨