분류 전체보기

Android

Codelab으로 LiveData 알아보기 - 7. Add the Play Again Button

이번에는 점수 화면에 Play Again 버튼을 추가하고 LiveData를 사용하여 클릭 리스너를 구현할 것이다. 해당 버튼은 점수 화면에서 다시 게임 화면으로 이동하는 이벤트를 발생시킨다. 먼저, 우리가 받아놓은 코드에는 이미 Play Again 버튼이 있지만 숨겨져 있다. 1. score_fragment.xml에서 play_again_button의 visibility를 보이도록 처리한다. 2. ScoreViewModel에 _eventPlayAgain이라는 Boolean값을 가지는 LiveData객체를 추가한다. 이 객체는 점수 화면에서 게임 화면으로 이동하는 이벤트를 저장하기 위해 만들었다. private val _eventPlayAgain = MutableLiveData() val eventPlay..

Android

Codelab으로 LiveData 알아보기 - 6. Add LiveData to the ScoreViewModel

이번에는 score를 ScoreViewModel의 LiveData 객체로 변경하고 옵저버를 붙일 것이다. 이번 작업은 4번의 LiveData를 GameViewModel에 추가한 작업과 비슷할 것이다. 앱의 모든 데이터가 LiveData를 사용하도록 하기 위해 ScoreViewModel에 이러한 변경점을 적용한다. 1. ScoreViewModel의 score 변수를 MutableLiveData로 변경한다. _score 변수를 네이밍 컨벤션을 지켜 이름을 변경하고 backing property를 추가한다. private val _score = MutableLiveData() val score: LiveData get() = _score 2. GameViewModel의 초기화 블럭 안에서 _score를 초기화..

Android

Codelab으로 LiveData 알아보기 - 5. Add a game-finished event(2)

저번 글에서 문제는 토스트 메시지가 프래그먼트가 기기 회전 등의 이유로 재생성될 때마다 다시 보이는 것이었다. 바로 본론으로 들어가보자. Reset the game-finished event 보통, LiveData는 데이터 변경이 있을 때만 업데이트를 옵저버에게 전달한다. 이 행동의 예외 사항은 옵저버가 비활성 상태에서 활성 상태로 변경될 때도 업데이트를 수신한다는 것이다. 이것이 게임 종료에 대한 토스트가 반복적으로 발생하는 이유이다. 화면 회전 이후 GameFragment가 재생성되면 비활성에서 활성 상태로 변경되고, 옵저버는 기존 ViewModel에 다시 연결된다. 그리고, 데이터를 수신한다. 그럼 gameFinished 메소드가 다시 호출되고, 토스트가 표시된다. GameViewModel안의 ev..

Android

Codelab으로 LiveData 알아보기 - 4. Add a game-finished event(1)

현재 우리가 수정한 앱은 'End Game' 버튼을 누르면 점수 화면으로 넘어간다. 우리는 플레이어가 모든 단어를 거치고나면 점수 화면으로 이동하기를 원한다. 플레이어가 마지막 단어를 끝내면 게임이 자동으로 끝나서 버튼을 누를 필요가 없도록 만들고 싶다. 이 기능을 구현하기 위해 우리는 이벤트가 발생되어야 하고 ViewModel에서 모든 단어가 보여졌을 때 프래그먼트에 전달되어야 한다. 이를 위해서는 LiveData 옵저버 패턴을 적용해야 한다. Observer pattern은 observable(Subject)과 observer 사이의 통신을 정의한다. 이 앱의 LiveData의 경우, 위 그림의 Subject는 LiveData 객체이다. 그리고, Observer들은 프래그먼트와 같은 UI contro..

Android

종종 간과하는 문제 해결 에피소드(feat. Handler, Thread)

오늘은 회사에서 마주한 에러를 해결했던 에피소드를 적어보고자 한다. 사실, 되게 사소하지만 크리티컬한 문제였다. 가장 먼저 오늘 마주한 에러를 다시 재현하기 위해 내 노트북에서 샘플앱을 만들었다 ㅋㅋㅋㅋㅋ 마주한 에러 로그를 첨부하겠다. java.lang.RuntimeException: Can't create handler inside thread Thread[Timer-0,5,main] that has not called Looper.prepare() at android.os.Handler.(Handler.java:227) at android.os.Handler.(Handler.java:129) at android.app.Dialog.(Dialog.java:138) at android.app.Dialo..

프로그래머스

369게임 코틀린(Kotlin)

오늘 풀어본 문제는 최근 풀었던 7의 개수와 비슷한 느낌의 문제였다. 문제 주어지는 숫자를 문자열로 변경해 해당 문자열의 모든 인덱스에 3, 6, 9가 있는지 검사하면 되는 문제였다. 풀이 if문이 생각보다 조건이 길어져 세로로 줄바꿈을 해봤다. 실행 결과

프로그래머스

잘라서 배열로 저장하기 코틀린(Kotlin)

이번엔 최근 푼 문제 중 그나마 코드 길이가 길어졌던 문제같다. 문제 이 문제가 생각보다 귀찮았던 이유는 어느 인덱스에서 문자열을 잘라내 배열에 대입해줄까 였다. 게다가 모든 문자열이 딱 나누어 떨어지는 길이로 문자열을 주는 것이 아니기 때문에 그에 대한 처리도 필요했다. 풀이 나는 일단 문자열을 인덱스를 통해 잘라내기 위해 substring을 사용할 계획을 세웠다. 이 때, startIndex와 endIndex를 주어야 했는데 인덱스 값을 구하는게 문제의 전부였던 것 같다. 일단 문자열이 주어진 n으로 나누어 떨어지는 경우와 아닌 경우로 구분을 했다. 그래서 나누어 떨어지는 경우는 특별히 인덱스에 대한 고민이 필요없었다. 나누어 떨어지지 않는 경우에 인덱스 값을 조정하지 않으면 exception이 분명..

프로그래머스

A로 B만들기 코틀린(Kotlin)

이번에 풀어본 문제는 별 생각없이 골랐는데 오랜만에 정렬을 해보게 되었다. 문제 가장 먼저 눈에 들어온 조건은 주어지는 두 String의 길이가 같다는 것이었다. 그리고, 입출력 예를 보면 두 문자열의 순서에 대해 언급하는 부분이 있다. 이 부분에서 아이디어를 가져와 String을 Array로 잘라내서 정렬을 한 뒤 두 배열의 같은 인덱스 값을 비교해 풀었다. 풀이 반복문을 실행하다 만약 두 배열의 같은 인덱스 값이 다르면 바로 0을 리턴하고 조건문에 걸리지 않았다면 1을 리턴하도록 했다. 실행 결과

프로그래머스

7의 개수 코틀린(Kotlin)

이 문제는 저번보단 훨씬 익숙한 문제였다. 풀이 주어지는 값을 보니 Int형 Array였다. 그런데 7이 포함되는지 보려면 이 값이 String인 경우가 검사하기 더 편했다. 풀이 IntArray의 원소를 String으로 가져와 해당 String의 모든 인덱스에 7이 있는지 검사했다. 실행 결과

프로그래머스

인덱스 바꾸기 코틀린(Kotlin)

이번에는 내가 거의 써보지 않은 클래스를 사용해본 문제였다. (아마.. 아예 안 써봤을수도..?!) 문제 요즘 회사에서는 거의 자바를 쓰다보니 자연스레 자바의 메소드들이 떠올랐다. 그래서 처음엔 String을 배열처럼 접근해 해당 인덱스의 문자를 바꾸려 했지만 접근이 불가능했다. 역시 자바 스타일로는 해결할 수 없는 문제가 있었다. 결국 초심자의 마음으로 문자열 특정 인덱스 바꾸기 등등의 검색어를 통해 구글링을 한 결과, StringBuilder를 사용해보았다. 풀이 실행 결과 생각보다 실행 속도는 엄청 빨랐다!

BonusTrack02.dev
'분류 전체보기' 카테고리의 글 목록 (14 Page)