안드로이드의 SharedPreferences.Editor에는

비슷한 역할을 하는 apply()와 commit() 두 개의 메소드가 존재한다.

 

이 둘의 차이점을 알아보자.

 

(*아래 내용은 http://developer.android.com/reference/android/content/SharedPreferences.Editor.html 의 영어 원문 일부를 번역한 것이다.)

 

 

public abstract boolean commt()

 

해당 Editor에서 변경한 preferences 값을 이 Editor의 SharedPreferences 객체에 전달한다.

 

두 개의 Editor가 동시에 preferences를 수정 중이라면 마지막에 호출된 commit()가 적용된다.

 

만약 반환값을 필요로 하지 않는다면 apply()를 써도 좋다.

 

반환값: 변경한 값이 성공적으로 저장장치에 반영되면 true를 반환한다.

 

 

public abstract void apply()

 

해당 Editor에서 변경한 preferences 값을 이 Editor의 SharedPreferences 객체에 전달한다.

 

자동적으로, 원래 SharedPreferences 안의 내용이 무엇이었든간에 요청받은 값으로 내용을 대체한다.

 

두 개의 Editor가 동시에 preferences를 수정 중이라면 마지막에 호출된 apply()가 적용된다.

 

저장공간에 지속적인 동기를 유지하며 preferences를 작성하는 commit()과는 달리,

 

apply()는 메모리 내의 SharedPreferences를 즉시 변경하지만 디스크로의 반영은 비동기적으로 시작되며

 

작업 실패에 대한 어떠한 알림도 받을 수 없다.

 

SharedPreferences는 프로세스 내에서 싱글톤 방식의 인스턴스이기 때문에

 

만약 반환 값을 필요로 하지 않는다면 commit() 대신에 apply()를 쓰는 것이 안전하다.

 

apply()의 경우 안드로이드 컴포넌트의 라이프사이클 및 디스크 쓰기의 상호작용을 신경 쓸 필요가 없다.

 

구조적으로 apply()를 한 후에 이루어지는 in-flight 디스크의 쓰기는 상태(state) 전환이 이루어지기 전에 완료되도록 되어있다.

Posted by Kugi

댓글을 달아 주세요

  1. name 2014.12.27 17:38  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다!
    근데 SharedPreferences는 프로세스 내에서 싱글톤 방식의 인스턴스이기 때문에
    만약 반환 값을 필요로 하지 않는다면 commit() 대신에 apply()를 쓰는 것이 안전하다는 논리가 잘 이해가 안됩니다..
    좀 더 자세한 설명을 들을수 있을까요

    • Kugi 2014.12.27 21:33 신고  댓글주소  수정/삭제

      마지막 호출만 적용되는 commit()과 달리 apply()는 호출될 때마다 SharedPreferences 내용을 바꿔주기 때문입니다.

  2. 사긔 2016.10.04 16:50 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다! 노란 밑줄 뜨면서 apply로 변경하라기에 무슨 차이인가 했더니 이해하기 쉽게 설명해주셔서 도움이 되었습니다