2016-08-07 2 views
1

URI의 arraylist를 성공적으로 저장하고 검색하려고합니다. 나는 어디에서 '저장'부분을 넣을지는 모르지만, onPause에 넣는 것이 합리적입니다. 비록 내가 활동을 떠날려고하면 내 애플 리케이션이 충돌합니다. 원래 onStop에 넣으려고했을 때 비슷한 오류가 발생했습니다. 제가 여기서 뭘 잘못하고 있는지 알아주세요.java.lang.RuntimeException : writeValueXml : 값을 쓸 수 없습니다.

FATAL EXCEPTION: main 


Process: my.package.myapplication, PID: 9357 
    java.lang.RuntimeException: Unable to pause activity {my.package.myapplication/my.package.myapplication.Person1Screen}: java.lang.RuntimeException: writeValueXml: unable to write value content://com.android.providers.media.documents/document/image%3A49684 
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3395) 
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3354) 
     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3329) 
     at android.app.ActivityThread.access$1100(ActivityThread.java:157) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5477) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Caused by: java.lang.RuntimeException: writeValueXml: unable to write value content://com.android.providers.media.documents/document/image%3A49684 
     at com.android.internal.util.XmlUtils.writeValueXml(XmlUtils.java:710) 
     at com.android.internal.util.XmlUtils.writeValueXml(XmlUtils.java:620) 
     at com.android.internal.util.XmlUtils.writeSetXml(XmlUtils.java:356) 
     at com.android.internal.util.XmlUtils.writeValueXml(XmlUtils.java:693) 
     at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:300) 
     at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:269) 
     at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:235) 
     at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:192) 
     at android.app.SharedPreferencesImpl.writeToFile(SharedPreferencesImpl.java:600) 
     at android.app.SharedPreferencesImpl.access$800(SharedPreferencesImpl.java:52) 
     at android.app.SharedPreferencesImpl$2.run(SharedPreferencesImpl.java:515) 
     at android.app.SharedPreferencesImpl.enqueueDiskWrite(SharedPreferencesImpl.java:536) 
     at android.app.SharedPreferencesImpl.access$100(SharedPreferencesImpl.java:52) 
     at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:458) 
     at my.package.myapplication.Person1Screen.onPause(Person1Screen.java:257) 
     at android.app.Activity.performPause(Activity.java:6557) 
     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1312) 
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3381) 
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3354)  
     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3329)  
     at android.app.ActivityThread.access$1100(ActivityThread.java:157)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:148)  
     at android.app.ActivityThread.main(ActivityThread.java:5477)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

내 onPause 방법은 다음과 같습니다. Person1Screen.java:257은 끝에있는 editor.commit 행입니다. (이 도움이 경우) 내에서 onCreate에서

@Override 
protected void onPause(){ 
    super.onPause(); 
    // We need an Editor object to make preference changes. 
    // All objects are from android.context.Context 
    SharedPreferences settings = getSharedPreferences(PREF_FILE, 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    Set<String> tempSet = new HashSet(happyList); 
    editor.putStringSet(HAPPY_LIST, tempSet); 
    editor.commit(); 
} 

내 검색 :

// Restore preferences 
    SharedPreferences settings = getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE); 
    Set<String> tempSet = settings.getStringSet(HAPPY_LIST, null); 
    if(tempSet != null) 
     for (String str : tempSet) 
      happyList.add(Uri.parse(str)); 

"happyList는"유형 ArrayList<Uri>이다.

답변

1

HashSet에서 Set<String>까지 확인되지 않은 제네릭 지정을 수행하고있는 것으로 보입니다.이 세트에는 실제로 Uri 개의 개체가 포함되어 있습니다. 이 설정을 환경 설정에 쓰려고하면 코드는 String을 읽으려고하지만 실제로는 Uri 객체를 가져 와서 충돌을 일으 킵니다. 이 문제를 해결하려면 Uri 개체를 String으로 다시 변환해야합니다. 당신의 게시

Set<String> tempSet = new HashSet<String>(); 
for (Uri uri : happyList) { 
    tempSet.add(uri.toString()); 
} 
+0

난 그냥이 문제를 파악하기 직전에

Set<String> tempSet = new HashSet(happyList);

:

그래서이 줄을 교체합니다. 당신이 쓴 것과 충돌이없는 것과 똑같이 했었습니다. – rafvasq

관련 문제