본문 바로가기
패스트캠퍼스 30일챌린지

[안드로이드] 패스트캠퍼스 챌린지 23일차!!(Runnable, Handler)

by 욧닭 2021. 9. 28.
반응형

들어가며

어제는 getSharedPreferences를 사용해 로컬 DB에 값을 직접 집어넣는 로직을 구현했습니다. preferences는 private하게 값을 설정 할 수 있기 때문에 민감한 정보에 대해 보안이 매우 좋으며 서버에 접근 없이 로컬 DB에 접근이 가능하니 간단한 로그인 프로젝트에 사용하기 좋은 함수 입니다.

오늘 배울 것은 다이어리에 작성한 내용을 getSheardPreferences를 이용해서 로컬디비에 저장하고 어플을 끄고 재실행 하더라도 작성하던 다이어리가 남아 있도록 로직을 구현 할 것이며 또 자동 저장 기능을 만들 것 입니다 자동저장을 하기 위해 addTextChangeListener를 설정 하고 값이 바뀔때 쓰레드를 실행 시켜 사용자가 0.5초 동안 아무 작업을 하지 않을때 저장을 하도록 설정 해보도록 하겠습니다!!

 

CODE

val diaryText: EditText = findViewById(R.id.diaryText)
val diaryPreference = getSharedPreferences("diary", Context.MODE_PRIVATE)
diaryText.setText(diaryPreference.getString("text",""))

onCreate함수에 선언하고 초기화하는 코드입니다. 앞서 다뤄 본 것처럼 getSharedPreferences를 사용해 diary라는 파일을 PRIVATE하게 만들고 diary파일안에 저장되어 있는 값을 text라는 키를 이용해 가져옵니다. 그 가져온 값은 바로 EditText인 diaryText에 set합니다. Preferences에 값이 없을 수도 있는데 그땐 getString 의 두번째 인수로 작성한 "" 빈값을 출력하게 됩니다

다시 말하자면 로컬 DB에 값이 없으면 빈값 있으면 저장되어있는 다이어리 텍스트를 불러 오는 것입니다!!

 

diaryText.addTextChangedListener {
    /// 로직
}

이벤트 Listener는 사용방법이 다들 비슷합니다. 가장 대표적인 리스너인 setOnClickListener 의 구조와 매우 비슷합니다.  코드는 람다 형식으로 되어 있으면 본문에는 diaryText에 값이 변경 될때 마다 취할 수 있는 로직을 작성하면 됩니다 그러면 여기서 더나아가서 값을 더 집어 넣겠습니다

private val handler = Handler(Looper.getMainLooper())

val runnable = Runnable {
	   diaryPreference.edit {
       putString("text",diaryText.text.toString())
   }
}
diaryText.addTextChangedListener {
    handler.removeCallbacks(runnable)
    handler.postDelayed(runnable, 500)
}

굉장히 많이 추가됬죠?! 여기서 쓰레드라는 개념이 나옵니다 쓰래드는 비동기 적으로 무언가를 실행 시킬때 사용되며 딜레이를 줘서 로직을 실행 시키는 기능도 있습니다. 여기서는 둘다 사용이 됩니다

스레드 생성은 Runnable 객체를 이용해 만듭니다  Runnable 에 작성된 코드를 스레드를 이용해 실행을 시키겠다 라고 정의 하면 될 것같습니다 

다음은 스레드 생성 로직이 있다면 그것을 직접 실행을 시켜야 하기 때문에 핸들러가 필요합니다 이 핸들러는 실행시킬 기능을 스레드로 옴기는 역할을 합니다 여기서 그역할을 handler.postDelayed로 구현하고 있습니다. 그냥 post를 할 수도 있겠지만 딜레이를 줘서 사용자가 0.5초 동안 아무런 행동을 하고 있지 않을 때 실행 시키겠금 구현을 했습니다 

마지막으로 removeCallbacks는 그야말로 post된 값이 있지만 0.5초기 지나지 않았다면 remove를 하고 없다면 아무런 행동도 취하지 않겠다라는 뜻입니다.  개인적으로 좋은 기능이라고 생각합니다. removeCallbacks 함수가 없다면 값이 변경 될때 마다 스레드에 post가 되서 과부하가 걸릴 수도 있지만 값이 post가 되기 전에 removeCallbacks를 만나면 삭제를 자동으로 해준다니.. 혁명입니다!

 

이렇게 프로젝트는 끝이 났고 내일은 정리하는 시간을 가져보도록 하겠습니다 

 

 

 

 

#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발#패스트캠퍼스후기#30개 프로젝트로 배우는 Android 앱 개발 with Kotlin 초격차 패키지 Online

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

반응형

댓글