2013-01-02 3 views
7

SharedPreferences를 사용하여 응용 프로그램의 여러 활동 내에서 값을 쓰고 나중에 읽습니다. 그것은 잘 작동하지만 최근에는 sincronized되지 않은 경우처럼 보인다. 내 말은, 나는 값을 쓰지 만, 다른 활동은 여전히 ​​이전 값을 읽는다. 때로는 정확하게 작동합니다. 아이디어가 있으십니까? 편집SharedPreferences는 이전 값을 읽습니다.

:

첫째, 스레드에서 : 경보 수신기에서

SharedPreferences prefs = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = prefs.edit(); 
editor.putInt("ComandToDo", value); 
editor.commit(); 
... some code later: 
alarmmanager.set(AlarmManager.RTC_WAKEUP, Miliseconds, sender); 

: 이 샘플 코드

SharedPreferences prefs = contexto.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); 
int value = prefs.getInt("ComandToDo", -1);  

그리고 여기에 값 "때문에 문제가 온다 "스레드에 쓰여진 값이 아닙니다.

+3

당신이 읽고 다른 스레드에 기록하고 있습니까 :

<service android:name="ServiceClass"/> 

알람을 만드시겠습니까? 읽고 쓰는 곳의 코드를 게시하십시오. – Ralgha

+0

예, diffetent 스레드, 활동, 브로드 캐스트 리시버, ... 여러 곳. 스레드가 SharedPreferences에 값을 쓰는 것을 상상해보십시오. 그런 다음 알람을 생성합니다. broadcastreceiver는 몇 분 후에 그 값을 읽습니다. 그러나 그것은 업데이트되지 않았습니다! – Ton

+0

값을 읽고 쓰는 곳에서 코드를 볼 필요가 있습니다. – Ralgha

답변

2
  1. 된 SharedPreferences는 프로세스, http://developer.android.com/reference/android/content/SharedPreferences.html에서 작동하지 않는 문서화되어, "참고 :. 현재 여러 프로세스에서 사용을 지원하지 않습니다이 클래스는이 나중에 추가 될 것입니다."

  2. 이 답변은 콘텐츠 제공 업체에 데이터의 캡슐화를 권장하고, 토론도 공유 SQLite는 등 일부 다른 옵션을 고려 : 또한 파일 시스템에 일반 오래된 파일을 https://stackoverflow.com/a/5265556/1665128

  3. . 우리는 몇 가지 프로젝트에서 잠금을 사용하여 문제없이 사용했습니다. 뿐만 아니라 당신을위한 옵션이 될 수 있습니다.

+0

감사! 한 가지 더 묻습니다. 실제로 두 프로세스가 서로 밟는 것은 아닙니다. 그것은 뭔가를 기록하고 트리거하고 경고하는 단 하나의 스레드입니다 (아마도 몇 시간 후에). 간단 해! 그렇다면 강제로 디스크에 쓰고 캐싱을 남길 수있는 방법이 있습니까? 고마워요 – Ton

+0

@ 톤 : 모바일 시스템이 가능한 한 빨리 커밋하지 않는 것이 이상하게 보입니다. 경우에 따라서는 모든 단순성에도 불구하고 논리적 오류 일 수 있습니까? 커밋을 덮어 쓰게되는 세 번째 코드처럼 저장 지점에 도달하지 못하도록 제어합니다 ("나중에"일부 코드에서 예외가 발생합니다). Log.d를 사용하면 어떻게됩니까? (안드로이드 코드를 살펴 보는 것도 흥미로울 것이지만 지금 당장은 없지만 AFAIK는 환경 설정을 파일에 저장합니다. –

+3

이 글을 쓰는 시점에서 [SharedPreferences] (http : //developer.android.com/reference/android/content/SharedPreferences.html)는 여전히 "주의 : 현재이 클래스는 다중 프로세스에서의 사용을 지원하지 않습니다. 나중에 추가 될 것입니다." 그러나 API 11은 [MODE_MULTI_PROCESS] (http://developer.android.com/reference/android/content/Context.html#MODE_MULTI_PROCESS)를 추가했습니다. "설정하면 공유 된 파일이 수정 된 경우에도 디스크의 파일이 수정되었는지 확인됩니다. 환경 설정 인스턴스가 이미이 프로세스에서로드되었습니다 ... "그래서, 당신은'getSharedPreferences (PREFS_NAME, Context.MODE_MULTI_PROCESS) '를 사용할 수 있어야합니다. – Anonsage

0

"MyPrefs"환경 설정 파일에 쓰고 "PerfilDeSonidoPreferencias"파일에서 읽으려고합니다. 동일한 환경 설정 파일에서 읽고 쓰십시오.

+0

미안하지만, 그것은 복사 - 붙여 넣기의 실수였습니다. 둘 다 "MyPrefs"또는 무엇이든간에 있습니다. – Ton

4

여기 제가 만난 점과 그 점을 바로 잡았습니다.

나는 알람 및 알람을 방송 수신자에서 트리거하고 있었는데, 앱을 시작할 때마다 읽힌 Shared-Preferences를 업데이트하고있었습니다.

알람이 트리거 된 후 앱이 시작될 때마다 해당 활동에서만 설정된 이전 값이 표시됩니다. 방송 수신인의 변경 사항은 반영되지 않았습니다.

SharedPreferences prefs = this.getSharedPreferences("Preferences", MODE_MULTI_PROCESS); 

참고 :

여기에 트릭은 다음과 MODE_MULTI_PROCESS 일반적으로

우리가 MODE_PRIVATE를 사용할 때 공유 - 기본 설정 만하는 것입니다 코드 모드를 변경 한 후에는 것이 좋습니다 디버깅하는 동안 문제를 피하기 위해 앱의 데이터를 지우십시오.

편집 : MODE_MULTI_PROCESS는 API (11) 내가 2 열 KEY & VALUE와 데이터베이스를 만드는 생각할 수있는 문제를 해결하기 전에 분 API (11)

이 필요합니다. 다른 모듈에서 액세스 할 수 있습니다.

+0

고맙습니다.하지만 적어도 API 11이 필요하다고 생각합니다. – Ton

+0

아 맞습니다. 죄송합니다. 언급하지 않았습니다. –

+0

문서가 신뢰할 수 없게 작동하므로이 문서는 더 이상 사용되지 않으므로 사용하지 말라고 말합니다. –

0

대신 IntentService 대신 BroadcastReceiver를 사용하십시오.그것은 나를 위해 일한다.

ServiceClass : 당신에

public class ServiceClass extends IntentService { 

    public NotificationPopupService(String name) { 
     super(name); 
    } 

    public NotificationPopupService(){ 
     super("YOU_DEFAULT_NAME"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

     do magic... 
    } 
} 

응용 프로그램 태그의 AndroidManifest.xml 파일 :

intent = new Intent(context, ServiceClass.class); 
pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
// magic after 2 seconds after the creation of alarm 
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 2000, pendingIntent); 
관련 문제