스팀 앱 개발기 #80 - 버그 수정: 태그 화면 시작시 bridge.get_ranked_posts API가 여러 번 실행되는 문제
시작하며...
태그 화면의 오류를 다 수정했기를 기대했습니다. 그렇지만... 이 화면이 시작될 때, bridge.get_ranked_posts API가 여러 번 실행되는 것을 발견했습니다. 그것을 1번만 실행하고 서버로부터 포스트 리스트를 받아와야 정상이죠. 이 문제는 불필요한 데이터 사용을 유발할 뿐만 아니라 UI에 부하가 걸릴 수 있다는 것입니다. 반드시 수정해야 하는 것입니다.
원인
라디오 그룹의 OnCheckedChangeListener 리스너에서 TagsFragment 클래스의 readRankedPosts() 메소드를 호출한 것이 잘못 되었습니다. 라디오 버튼의 체크를 없애기 위해 RadioGroup 뷰의 clearCheck() 메소드를 호출했는데, 이 때에도 OnCheckedChangeListener 리스너가 실행되었습니다. 그걸 몰라서 readRankedPosts() 메소드가 반복 실행되었습니다.
MainViewModel 객체의 currentTag 라이브 데이터와 TagsViewModel 객체의 sort 라이브 데이터를 모두 관찰하는 것도 원인이었습니다. 처음에는 두 자료가 모두 설정된 후부터 readRankedPosts() 메소드를 실행하고 이후 둘 중 하나의 라이브 데이터만 변경되어도 이 메소드를 호출하고 싶었습니다. 그러나 처음에 이 두 라이브 데이터를 설정하면서 readRankedPosts() 메소드가 2번 호출 되었습니다.
해결 방법
- OnCheckedChangeListener 리스너에서 readRankedPosts() 메소드 호출 코드 제거
private val sortCheckedChangedListener = OnCheckedChangeListener { radioGroup, radioButtonId ->
viewModel.sort.value = when (radioButtonId) {
R.id.radiobtn_trending -> GetRankedPostParamsDTO.InnerParams.SORT_TRENDING
R.id.radiobtn_created -> GetRankedPostParamsDTO.InnerParams.SORT_CREATED
R.id.radiobtn_payout -> GetRankedPostParamsDTO.InnerParams.SORT_PAYOUT
else -> GetRankedPostParamsDTO.InnerParams.SORT_TRENDING
}
}
TagsFragment 클래스의 currentSortObserver 필드 제거
라디오 버튼 클릭 처리 리스너 정의
- readRankedPosts() 메소드 호출하여 포스트 리스트 새로 받아 옴
private val radiobtnSortClickListener = OnClickListener {
readRankedPosts()
}
- TagsFragment 클래스의 onViewCreated 메소드에서 라디오 버튼 클릭 처리 리스너 설정
binding.apply {
radiobtnTrending.setOnClickListener(radiobtnSortClickListener)
radiobtnCreated.setOnClickListener(radiobtnSortClickListener)
radiobtnPayout.setOnClickListener(radiobtnSortClickListener)
// ...
}
- TagsFragment 클래스의 onViewCreated 메소드에서 MainViewModel 객체의 currentTag 라이브 데이터 관찰을 맨 뒤로 미룸
- 이 코드를 호출하여 currentTagObserver가 바로 호출되기 때문에 TagsViewModel 객체의 sort 라이브 데이터가 먼저 설정되어야 함
GitHub Commit
마치며...
끝날 듯 끝나지 않는 태그 화면 구현이었습니다. 내일은 보팅 리스트를 보여주는 기능을 구현해 보고자 합니다. 버그, 안정화도 중요하지만, 다음 화면으로 진도를 나가는 것도 중요하니까요!
지난 스팀 앱 개발기
- #79 - 태그 화면에 새로 고침 기능 추가
- #78 - 태그 화면에서 포스트들의 디폴트 썸네일 변경
- #77 - 태그 화면에서 썸네일 없는 포스트 항목에 엉뚱한 썸네일이 보이는 오류
- #76 - 태그 검색시 앱이 죽는 버그 수정
- #75 - 태그 화면의 포스트 항목에 태그/커뮤니티 표시
- #74 - 태그 화면에서 포스트 리스트 추가 로딩시 깜빡임 문제 해결
- #73 - 태그 화면의 포스트 리스트에 무한 스크롤 적용
- #72 - 태그 화면의 포스트 리스트에서 항목들 사이 분리선 보이기
- #71 - 태그 화면에서 포스트 항목들의 썸네일 로딩
- #70 - 태그 화면 1차 구현
- #69 - 태그 화면에 데이터 바인딩 적용
- #68 - 태그 화면(TagsFragment) 구성
- #67 - TagsViewModel 클래스에 포스트 리스트 구하는 메소드 그리고 라이브 데이터 추가
- #66 - bridge.get_ranked_posts API 연동 구현: ReadRankedPostsUseCase 클래스 추가
- #65 - bridge.get_ranked_posts API 연동 구현: SteemRepository 인터페이스, SteemRepositoryImpl 클래스 수정
- #64 - bridge.get_ranked_posts API 연동 구현: SteemService 인터페이스에 메소드 추가
- #63 - bridge.get_ranked_posts API 관련 데이터 클래스 추가 수정
- #62 - bridge.get_ranked_posts API의 응답 자료를 맡을 데이터 클래스 수정
- #61 - layout_post_item.xml 수정 후 예상치 못한 빌드 오류
- #60 - bridge.get_ranked_posts API의 응답 자료를 맡을 데이터 클래스 정의
- #59 - 태그별 포스트 리스트를 구하기 위한 bridge.get_ranked_posts API
- #58 - 포스트 리스트를 구성할 항목의 레이아웃 (3) 데이터 클래스 정의 및 데이터 바인딩 적용
- #57 - 포스트 리스트를 구성할 항목의 레이아웃 (2)
- #56 - 포스트 리스트를 구성할 항목의 레이아웃
- #55 - .gitignore 파일 작성
- #54 - RxJava 관련 메모리 누수 방지 코드 작성
- #53 - 버그 수정: 인터넷 미연결시 API 실행하면 앱 강제 종료
- #52 - 인터넷 미연결시 API 실행하면 어떻게 될까?
- #51 - 파워다운 끝났으나 SP to power down 값이 0이 아닌 버그
- #1 ~ #50
Posted through the AVLE Dapp (https://avle.io)
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Upvoted! Thank you for supporting witness @jswit.