본문 바로가기
Programando/Android

[Android/Kotlin] SharePreferences, Thread_(4)

SharedPreferences

: 안드로이드 앱에서 키-값 데이터를 저장할 수 있는 방법 중 하나로, 저장하려는 키-값 컬렉션이 비교적 작은 경우 SharedPreferences API를 사용해야 한다. 각 SharedPreferences 파일은 프레임워크에서 관리하며 비공개이거나 공유일 수 있다.

SharedPreferences는 preference라는 파일을 다른 앱과 같이 share할 수 있도록 해주는 기능이지만, 해당 앱에서만 사용하고 싶을 때에는 Context.MODE_PRIVATE를 선언해준다.

getSharedPreferences("password", Context.MODE_PRIVATE)

 

preference 파일에서 password를 가져오고 싶을 때에는 getString을 사용해 password 값을 가져올 수 있다.

val passwordFromPreferences = getSharedPreferences("password", Context.MODE_PRIVATE)

passwordFromPreferences.getString("password", "000") // 000은 password라는 키의 default value

preference의 password는 edit을 통해 바꿀 수 있다. 이 password를 저장하기 위한 방법으로는 commit과 apply가 있다. commit은 파일이 저장될 때까지 UI를 멈추고 기다리는 동기적인 방식이지만 apply는 파일이 저장될 때까지 기다리지 않는 비동기적인 방식이다. edit은 기본적으로 commit이 false가 되어있기 때문에 commit의 방식을 사용하기 위해서는 edit(true)나 edit { ... commit() } 과 같이 코드를 작성하면 된다.

// 1번 방법
passwordFromPreferences.edit(true) {
	val passwordFromUser = "${np_password1.value}${np_password2.value}${np_password3.value}"
	putString("password", passwordFromUser)
}

// 2번 방법
passwordFromPreferences.edit {
	val passwordFromUser = "${np_password1.value}${np_password2.value}${np_password3.value}"
	putString("password", passwordFromUser)
    
	commit()
}

 

여러 NumberPicker의 값 붙여 사용하기

val passwordFromUser = "${np_password1.value}${np_password2.value}${np_password3.value}"

 

AlertDialog.Builder의 사용

AlertDialog.Builder(this)
	.setTitle("실패")
	.setMessage("비밀번호가 잘못되었습니다.")
	.setPositiveButton("확인") { _, _ -> // 람다식 }
	.create() // AlertDialog를 생성하고
	.show() // show()를 통해 보여지도록

: 원래는 .setPositiveButton("확인") { dialog, which -> ... } 가 맞지만 확인 버튼을 누르면 그냥 Dialog가 종료되길 원하므로 _, _ -> 와 같이 작성한다.

 

addTextChangeListener의 사용

: EditText의 값이 변경될 때마다 호출되는 Listener

val et_diary = findViewById<EditText>(R.id.et_diary)
val detailPreferences = getSharedPreferences("diary", Context.MODE_PRIVATE)

et_diary.setText(detailPreferences.getString("detail", ""))

et_diary.addTextChangeListener {
	// 람다식
	detailPreferences.edit {
		putString("detail", et_diary.text.toString())
	}

}

 

Thread

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

: Looper.getMainLooper( )를 통해 이 Handler는 메인 쓰레드에 연결된 Handler임을 선언한다.

Thread 기능을 이용하기 위해서 Runnable Interface를 구현한다.

val runnable = Runnable {
	getSharedPreferences("diary", Context.MODE_PRIVATE).edit {
		putString("detail", et_diary.text.toString())
	}
}

 

handler.postDelayed( )를 통해 해당 Runnable을 0.5초에 한 번 실행되도록 하고, 이 0.5초 이전에 실행되지 않고 pending 되어 있는 Runnable이 있다면 지워주기 위해 removeCallbacks( )를 사용한다.

et_diary.addTextChangeListener {

	handler.removeCallbacks(runnable)
	handler.postDelayed(runnable, 500)

}
반응형