2013-03-19 2 views
6

나는 사용자가 버튼을 클릭 할 때마다 사운드가 재생되는지 여부를 제어하는 ​​환경 설정을 가지고있다. 이후 (기본 설정은 유지됩니다 때문에 I/O 작업과 유사)읽기/쓰기 환경 설정이 비용이 많이 드는 작업입니까?

private void playButtonClickSound() { 
    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(parentActivity); 
    boolean sounds = sharedPrefs.getBoolean("prefSounds", false); 
    if (sounds) { 
     // blah 
    } 
} 

나는 독서 환경을 생각 것은 비싼 작동 할 수 있으며 그 각 시간은 사용자가 다음과 같은 메서드를 호출 버튼을 클릭 사용자가 단추를 자주 클릭하면 이렇게하는 것이 좋지 않을 수 있습니다.

일반적으로 자주 환경 설정을 읽고 쓰는 것은 좋지 않은 생각입니까? 그렇다면 환경 설정 변경 수신기를 등록하는 것과 같은 다른 방법이있을 수 있습니다. 환경 설정이 변경되면 알림을 받으시겠습니까?

답변

5

내가해야하든 안하든 UI 스레드에서 솔직하게 모든 일을 처리하고 느린 장치에서도 약간의 주저함을 발견하지 못했습니다. 그것은 꽤 지긋 지긋합니다. 즉 입출력이므로 비동기 적으로 수행하면 확실히 이 아닐 것입니다. 것입니다. 쓰기의 경우 API 9 이상을 타겟팅하는 경우 commit() 대신 apply()을 사용하여 비동기 적으로 수행 할 수 있습니다.

환경 설정 변경 리스너에 대한 질문에 관해서는, 그래 당신은뿐만 아니라 수행 할 수 있습니다

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
prefs.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() { 
    @Override 
    public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { 
     if("my_preference_key".equals(key) { 
      //Handle it here 
     } 
    } 
} 
+1

그게 내가 미래에 어떻게 할거야. :) –

0

Java 참조를 사용하여 메모리 캐시에 구현할 수 있습니다. 다음을 수행 할 수 있습니다.

public boolean getMySound(){ 
    boolean sound=getFromMemory(); 
    if (!sound){//if not available 
      //lets load from shared preferences 
    sound=getSoundFromPreference(); 
     // update memory cache so next time i will load from memory 
    addToMemory(sound); 
    } 
    return sound; 
} 

이렇게하면 입출력 작업 수가 최소화됩니다.

+0

나는 그런 정확한 종류의 일에 대해 생각했다! –