2014-02-05 77 views
1

在我的应用程序中,我将产品的目录以TXT的形式保存在SharedPreferences中。这些txt文件每个都有或多或少的4mb。SharedPreferences上的奇怪OutOfMemory崩溃

然而,当我尝试检查,如果用户已经下载目录(检查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

欢迎 - 很高兴你解决了它 - 尝试在发布代码时避免水平滚动条 - 外观和读取更好:) - 在eclipse中激活“包装线”格式化 - 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

我认为它是,由于任何键/节点长期价值。你应该尝试将文件保存在内部存储器(私人模式)中,而不是共享prefrences。写入文件不会有任何这样的问题。

2

SharedPreferences不是存储数据的好选择。它的目的是存储小的关键值对,如设置选项,用户名等。你应该肯定使用SQLite来做到这一点。我怀疑SharedPrefences甚至已经过这样的测试。由于字符串保存在堆中,因此使用这种方法会很快耗尽内存。在大多数设备上,您最多可以加载2或3个此大小的字符串。

我怀疑除了SQLite之外还有其他解决方案。