티스토리 뷰

Android/Concept

[Android] Shared Preference

ch4njun 2020. 12. 4. 18:36
반응형

앱 개발시 각종 환경 설정 값들을 보관하기 위한 목적으로 사용하는 저장공간이다.

(예를 들어, 사운드 on/off, 진동 on/off 등의 기본적인 설정값들을 저장할 수 있다.)

 

앱이 종료되더라도 이러한 설정 값들은 저장되어야 하는데 이를 파일 입출력으로 처리하기는 매우 번거롭다. 따라서 이러한 역할을 수행하기 위해 Shared Preference를 사용한다.

 

1. 안드로이드에서 라이브러리로써 편리하게 제공한다.

2. HashMap을 사용해 원하는 데이터를 키/값 형태로 저장해 쉽게 추가, 삭제할 수 있다.

3. 내장메모리에 파일형태로 저장되기 때문에 앱이 종료, 핸드폰 종료되더라도 영구히 보관할 수 있다.

 

 

 


 

위와같은 앱에 대해서 Shared Preference를 사용하는 예시코드를 살펴보자.

SharedPreferences mPref = null;
CheckBox mSoundCheckbox = null;

// Shared Preference값이 변경되었을 때 호출되는 리스너를 정의한다.
OnSharedPreferenceChangeListener mPrefCHangeListener = new OnSharedPreferenceChangeListener() {
	public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    	// 해당 Key에 대해서 변경된 것이기 때문에 값을 읽어와서 보여준다.
        // 값이 없으면 true값 가져오도록 즉, Default값을 정해주는 것이다.
    	boolean isSoundOn = sharedPreferences.getBoolean(key, true);
        Toast.makeText(MainActivity.this, key + " 설정이 " + isSoundOn + "로 변경", Toast.LENGTH_LONG).show();
    }
};
protected void onCreate(Bundle savedINstanceState) {
	// ...
    
    mSoundCheckbox = (CheckBox)findViewById(R.id.sound_on_off_chkbox);
    
    // Shared Preference 객체를 얻어온다. 그 이름이 Setting이 되는 것이다.
    mPref = getSharedPreferences("Setting", Context.MODE_PRIVATE);
    
    // 이미 저장된 값이 있으면 가져와라. 복구시키는 과정이다.
    boolean isSoundOn = mPref.getBoolean("SOUND_SET", true);
    mPref.registerOnSharedPreferenceChangeListener(mPrefChangeListener);
    mSoundChkbox.setChecked(isSoundOn);
}
public void onClick(View v) {
	SharedPreferences.Eidtor prefEditor = mPref.edit();
    prefEditor.putBoolean("SOUND_SET", isSoundOn);
    prefEditor.apply();
}

onClick시 위와같은 onClick의 코드와 같이 Shared Preference에 해당 값을 추가한다.

이렇게 변경될 경우 미리 등록해둔 Listener가 호출되며 Toast 메시지가 보여지게 된다.

 

결국 Shared Preference에 값을 저장하고, 읽어오는 이 두가지 과정이 가장 중요할 것이라 생각된다.

 

이렇게 저장된 내용은 아래와 같은 경로에 XML 파일의 형태로 저장되게 된다.

 

그러나, getSharedPreference 함수의 특징으로 함수 호출시 파일에 저장된 모든 Preference 값들이 한꺼번에 메모리에 로드되는 것이 있다. 따라서 시간이 오래걸리게 된다. (XML파일을 변환하는 시간)

 

getSharedPreference 함수로 가져온 객체를 통해 값을 읽어오는 함수는 아래와 같다.

 

 

 

이번엔 가져오는게 아니라 Shared Preference에 값을 쓰는 함수들이다.

 

 

commit 함수

메모리에 저장되어 있는, 변경된 값을 곧바로 파일에 저장한다.

파일에 저장하는 과정을 실제로 수행하기 때문에 속도가 느리다.

 

apply 함수

메모리에 저장되어 있는, 변경된 값을 작업 스레드에 의해서 파일에 저장한다.

작업 스레드에 의해서 수행하기 때문에 속도가 빠르다.

 

 

 


getSharedPreference 함수를 최초 호출했을 때보다 그 이후에 호출했을 때가 더 빠른데 이는 Chacing효과 때문이다. 따라서 앱을 시작할 때 최초 호출해두면, 앱이 진행될 때 로드하는데 걸리는 시간을 사용자가 최소한으로 느끼도록 구성할 수 있다.

 

근데 교수는 Preference의 데이터를 사용하지 않는다면 낭비가된다.. 라고 말하네요. 뭐가 맞는지는 어떤 앱을 어떻게 구성하느냐에 따라서 다를거 같다.

 

 

 

반응형

'Android > Concept' 카테고리의 다른 글

[Android] BaseAdapter (View Group)  (0) 2020.12.09
[Android] SQLite Database  (0) 2020.12.04
[Android] 파일과 데이터베이스  (0) 2020.12.01
[Android] Remote Bound Service (AIDL 사용)  (0) 2020.11.30
[Android] Local Broadcast  (0) 2020.11.29
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함