2014-02-05 3 views
1

내 응용 프로그램에서는 SharedPreferences의 제품 카탈로그를 TXT 형식으로 저장합니다. 이 txt 파일은 각각 4MB 이상입니다. 그러나이상한 OutOfMemory on SharedPreferences 충돌

나는 사용자가 이미 카탈로그 (된 SharedPreferences에서 디렉토리를 확인) 응용 프로그램 충돌을 다운로드 한 경우에는 확인하려고

로그 :

02-05 15:29:34.631: E/AndroidRuntime(32620): FATAL EXCEPTION: SharedPreferencesImpl-load 
02-05 15:29:34.631: E/AndroidRuntime(32620): Process: br.com.asiatex, PID: 32620 
02-05 15:29:34.631: E/AndroidRuntime(32620): java.lang.OutOfMemoryError 
02-05 15:29:34.631: E/AndroidRuntime(32620): at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:124) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at java.lang.StringBuilder.append(StringBuilder.java:271) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at org.kxml2.io.KXmlParser.readValue(KXmlParser.java:1345) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at org.kxml2.io.KXmlParser.next(KXmlParser.java:390) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at org.kxml2.io.KXmlParser.next(KXmlParser.java:310) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at com.android.internal.util.XmlUtils.readThisValueXml(XmlUtils.java:781) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at com.android.internal.util.XmlUtils.readThisMapXml(XmlUtils.java:559) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at com.android.internal.util.XmlUtils.readThisValueXml(XmlUtils.java:809) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at com.android.internal.util.XmlUtils.readValueXml(XmlUtils.java:751) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at com.android.internal.util.XmlUtils.readMapXml(XmlUtils.java:490) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at android.app.SharedPreferencesImpl.loadFromDiskLocked(SharedPreferencesImpl.java:120) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at android.app.SharedPreferencesImpl.access$000(SharedPreferencesImpl.java:52) 
02-05 15:29:34.631: E/AndroidRuntime(32620): at android.app.SharedPreferencesImpl$1.run(SharedPreferencesImpl.java:91) 

것은 내 문자열을 저장하고있어 어떻게

private void storeJson(){ 
     String mPref; 
     String mPrefString; 
     if (flag == DOWNLOAD_CURTAINS){ 
      mPref = "mPrefCurtains"; 
      mPrefString = "jsonCurtains"; 
     } else if (flag == DOWNLOAD_CARPETS) { 
      mPref = "mPrefCarpets"; 
      mPrefString = "jsonCarpets"; 
     } else { 
      mPref = "mPrefQuits"; 
      mPrefString = "jsonQuits"; 
     } 
     SharedPreferences settings = context.getSharedPreferences(mPref, Context.MODE_PRIVATE); 
     SharedPreferences.Editor prefEditor = settings.edit(); 

     prefEditor.putString(mPrefString, result).commit(); 
    } 

나는 확인하고있어 방법 :

public void checkCurtains() { 
    Boolean check = false; 

    mPrefs = this.getSharedPreferences("mPrefCurtains", MODE_WORLD_READABLE); 
    check = mPrefs.contains("jsonCurtains"); //crashing here on debbug 

    if (check) { 
     setUpCurtains(true); 
    } else { 
     setUpCurtains(false); 
    } 
} 

도와주세요!

감사합니다.

+0

그냥 멋지다 :'if (check) {setUpCurtains (true); } else {setUpCurtains (false); }'->'setUpCurtains (check); ' –

+0

@Mr_and_Mrs_D 아, 내 잘못이야. 감사합니다 – rsicarelli

+0

환영 - 기쁜 당신이 그것을 해결 - 코드를 게시 할 때 가로 스크롤바를 피하십시오 - 외모와 읽고 더 :) :) - "포장 줄"서식을 활성화하십시오 - logcats 훨씬 더 좋게 만들 수 없습니다 - 시간 스탬프를 제거하는 데 도움이됩니다. –

답변

0

답장을 보내 주셔서 감사합니다.하지만 SharedPreferences와 작동하도록했습니다.

public void checkCurtains() { 
     Boolean check = false; 

     SharedPreferences mPrefs = this.getSharedPreferences("mPrefCurtains", MODE_PRIVATE); 
     check = mPrefs.contains("jsonCurtains"); 

     setUpCurtains(check); 
    } 

private void checkCarpets(){ 

     Boolean check = false; 

     SharedPreferences mPrefs = this.getSharedPreferences("mPrefCarpets", MODE_PRIVATE); 
     check = mPrefs.contains("jsonCarpets"); 

     setUpCarpets(check); 
    } 

private void checkQuits(){ 
     Boolean check = false; 

     SharedPreferences mPrefs = this.getSharedPreferences("mPrefQuits", MODE_PRIVATE); 
     check = mPrefs.contains("jsonQuits"); 

     setUpQuits(check); 
    } 

감사를 다시 다음과 같이

나는, 클래스 및 수정 방법의 시작 변수를 제거했다!

0

나는 모든 키/노드에 대한 긴 가치 때문인 것으로 생각합니다. 공유 된 프리 프레스 대신 내부 스토리지 (개인 모드)에 파일을 저장해야합니다. 파일에 글을 쓸 때 그와 같은 문제는 발생하지 않습니다.

2

SharedPreferences는 데이터를 저장하는 데 적합하지 않습니다. 설정 옵션, 사용자 이름 등과 같은 작은 키 값 쌍을 저장하도록 설계되었습니다.이 작업에는 반드시 SQLite를 사용해야합니다. 나는 SharedPrefences가 이런 식으로 테스트되었다고 의심한다. 문자열이 힙에 있기 때문에이 방법을 사용하면 메모리가 부족해질 수 있습니다. 대부분의 장치에서이 크기의 문자열을 최대 2 ~ 3 개까지로드 할 수 있습니다.

SQLite 이외의 솔루션이있는 것 같습니다.