[Vote22] 2022/02/10 Update

Jake·2022년 2월 10일
0

Vote22

목록 보기
1/4

1. 다크모드 기기에서 화면 출력 오류

Android Studio에서 프로젝트를 생성하면 res/values/themes에 자동으로 themes.xml(night) 파일이 생성됩니다.

이 파일의 스타일 설정을 아직 바꿔주지 않아서 잘못 출력이 됐었는데, themes.xml 파일 내 코드 수정을 통해 해결했습니다.

  • 수정사항 [themes.xml(night)]

    이전:

    parent="Theme.MaterialComponents.DayNight.DarkActionBar"

    이후:

    parent="Theme.MaterialComponents.Light.NoActionBar"

향후 다크모드도 추가할 수 있게 되면 좋겠습니다.

2. Splash Screen 추가

Andoid 12부터는 개발자가 splash screen을 특별히 설정하지 않아도

windowBackground + App Icon 조합으로 splash screen이 자동으로 제공됩니다.

Google을 통해 찾아본 결과, 이전에는 Splash Activity를 생성하고 App 시작 시 생성된 초기 액티비티로 설정하여 splash screen을 보여주는 방식이 가장 보편적이었던 것 같습니다.

하지만 이 경우 API 31 이상의 버전에서는
1) android가 자동으로 생성한 splash screen + 2) Splash Activity 통해 보여지는 splash screen

총 2번의 splash screen을 사용자가 보게 됩니다.

따라서 Vote22에서는 splash screen api를 사용하여 splash screen을 구현하였습니다.

  • 과정
    1. SplashScreen library

      build.gradle에서 dependency를 추가해줍니다.

      현재 developer.android.com에서 확인 가능한 버전은 1.0.0-beta01 이었습니다.

      implementation 'androidx.core:core-splashscreen:1.0.0-beta01'

    2. res/styles.xml에 style 추가

      <style name='Theme이름' parent="Theme.SplashScreen">
          <item name="windowSplashScreenBackground">배경 컬러</item>
          <item name="windowSplashScreenAnimatedIcon">사용할 아이콘</item>
          <item name="postSplashScreenTheme">Splash Screen 종료 후 사용할 Theme</item>
      </style>

      https://developer.android.com/reference/kotlin/androidx/core/splashscreen/SplashScreen

      에서 디자인 등 자세한 사항들을 확인할 수 있습니다.

    3. AndroidManifest.xml에서 theme 변경

      android:theme="@style/Theme이름"

    4. Main Activity에 코드 추가

      import androidx.core.splashscreen.SplashScreen;
      
      @Override
          protected void onCreate(Bundle savedInstanceState) {
              SplashScreen splashScreen = SplashScreen.installSplashScreen(this);

      자동 import 쓰신다면, android.window.SplashScreen로 import되지 않게 주의! (경험담)

3. 추세선 그래프 안정성 개선

현재 Vote22에서 추세선 그래프를 표시하는 프로세스는 다음과 같습니다.

  1. 앱 실행 → MainActivity → 여론조사 fragment에서 서버에 여론조사 데이터를 요청
  2. 서버로부터 받은 데이터를 View model에 post
  3. 추세선 fragment 실행 시, view model에서 여론조사 정보를 받아 기관별로 정리

이 때 여론조사 → 추세선 탭으로 넘어가는 과정에서

여론조사 fragment에서 view model에 아직 데이터가 등록되지 않은 경우 NullPointException이 발생하는 것을 확인했습니다.

통신속도에 문제가 있을 경우 앱이 비정상 종료될 수 있기 때문에, 이 부분에 대한 수정이 필요했습니다.

  • 해결 : LiveData 활용
    1. 여론조사 fragment에서 view model에서 받아온 데이터가 null 인 경우를 예외처리 해주고

    2. Live data의 observe() 메소드를 사용하여 데이터 변경 시 추세선 그래프를 새로 작성할 수 있도록 변경

      surveyViewModel.getSurveyResultList().observe(getViewLifecycleOwner(), new Observer<List<SurveyResult>>() {
          @Override
          public void onChanged(List<SurveyResult> surveyResultList) {
                  //live data 변경 시 실행 코드
          }
      });
  • 또 다른 문제

    현재 추세선 fragment는 여론조사 결과를 RecyclerView에 기관별로 정리하여 제공하고 RecyclerView의 아이템 클릭 시 해당 기관의 날짜별 여론조사 결과를 그래프로 표시합니다. 그런데 테스트 과정에서 LiveData가 변경되지 않았는데도 onChanged 메소드가 호출되는 것을 확인하였고, 추가로 recyclerview 관련 문제를 파악했습니다.
    • 문제점
      1. Live Data가 변경되지 않았음에도 onChanged가 호출되는 문제

      2. RecyclerView Adapter

        현재 adapter가 데이터의 추가, 제거 등의 업데이트를 반영할 수 있는 코드가 아직 없어서 급한대로 업데이트 시 adapter를 새로 선언하고 데이터를 다시 전부 추가하는 방식으로 구현했습니다.

        따라서 추후 이를 개선할 수 있는 방향으로 코드를 수정할 예정입니다.

Vote22는 구글 플레이스토어에서 ‘vote22’로 검색해서 다운받을 수 있습니다.

profile
Java/Spring Back-End Developer

0개의 댓글