2017-12-15 24 views
-1

적용과 커밋의 차이점을 알고 있습니다. 제 경우에는 commit()을 사용하고 싶지만, 안드로이드는 백그라운드에서 실행되고 메인 스레드를 차단하지 않기 때문에 apply()을 사용하도록 제안합니다.SharedPreferences - apply() 대 commit()

신청서를 사용하면이 기능이 작동합니까? 아니면 신청하기 전에 신청서를 업데이트하지 않았습니까?

editor.putBoolean("TEST", true) 
editor.apply() 

if (preferences.getBoolean("TEST")) { 
    //do something 
} 

답변

7

나는 documentation에서이 상태로는 일을 기대 :

apply() 즉시 메모리 된 SharedPreferences로의 변경을 커밋을하지만 비동기 디스크에 커밋 시작하고 당신은하지 않습니다 모든 실패를 통보받습니다.

동일한 환경 설정 개체 (싱글 톤)에 액세스 할 때 항상 일관된보기가 있어야합니다.

+1

"commit()"과 같은 함수가있는 이유는 무엇입니까? –

+1

커밋은 쓰기가 성공했는지 여부를 알아야 할 경우 유용합니다. 이 정보를 사용하지 않으면, 항상 apply를 사용한다. –

+1

원래의 API 레벨 1에'commit()'이 존재하고, API 레벨 9에'apply()'가 도입되었다.'commit()'는'true'를 반환한다. 디스크에 쓰기 작업이 성공한 반면,'apply()'를 사용하면 최상의 결과를 기대할 수 있습니다. –

2

apply()은 나중에 디스크에 비동기 적으로 기록되는 임시 Map에 기록합니다. getBoolean()과 같은 메서드를 즉시 사용하는 경우이 키의 값이 임시 Map에 있으면 먼저 조회하고 반환합니다.

정확히 작동하는 방법을 보려면 SharedPreferencesImpl의 소스 코드를 확인하십시오.