SharedPreferences에 값이 제대로 들어가는 지 테스트했었는데

 

테스트 할 당시에는 제대로 값이 남아있는 듯 보였으나 나중에 스마트폰을 재부팅한 뒤 다시보니

 

아무런 데이터도 저장되어있지 않은 것을 발견하였다.

 

확인해본 결과 환경설정->어플리케이션 메뉴에서 어플을 찾아 강제종료버튼(작업관리자에 표시되지 않더라도 활성화되어있다)을 누르고 나면

 

다시 실행했을 때 SharedPreferences 값이 하나도 남아있지 않음을 알 수 있었다.

 

메모리 혹은 임시파일 형태로 저장되는 것이라고 추측된다.

 

해결 방법은 다음과 같다.

 

 

SharedPreferences의 Editor를 사용하기 전에 Editor 객체의 clear() 메소드를 호출했더니 문제가 해결되었다.

 

SharedPreferences.Editor ePref = pref.edit();
ePref.clear();
ePref.putStringSet(XXX , XXX);
ePref.apply();

 

 

Editor에 값을 갱신한 후 commit() 또는 apply()를 빠뜨리면 아예 저장이 되지 않으므로 주의하자.

 

또한 clear()를 호출한 후에는 SharedPreferences 값이 지워지므로 보존해야 할 데이터는 따로 마련한 변수 등에 저장해두어야 한다.

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by Kugi

댓글을 달아 주세요




안드로이드의 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로 변경하라기에 무슨 차이인가 했더니 이해하기 쉽게 설명해주셔서 도움이 되었습니다



티스토리 툴바