2014-06-23 1 views
4

지금 당분간 안드로이드 응용 프로그램을 개발해 왔지만 최근에는 단편화로 들어와 최근에는 단편화 된 방법으로 많은 문제를 겪고 있습니다. 내 응용 프로그램의 활동 중 하나에는 사용자에게 항목 목록을 표시하는 4 개의 서로 다른 단편이 있습니다. 각 조각은 처음에 만들어지며 한 번만 표시되고 다른 탭을 선택하면 숨겨집니다. 각각의 조각이 만들어지면조각으로 파편 충돌 : onPause 메서드가 호출 될 때 값 오류를 마샬링 할 수 없습니다.

  ft = fm.beginTransaction(); 

      if(currentFragment !=null){ 
       ft.hide(currentFragment); 
      } 
      if(whereFragment !=null){ 
       ft.show(whereFragment); 
      }else{ 
       if(mPlaceList.size()>0){ 

       Bundle bundle = new Bundle(); 
       bundle.putSerializable("array", mPlaceList); 
       whereFragment = new WhereFragment(); 
       whereFragment.setArguments(bundle); 
       ft.add(R.id.newpost_container,whereFragment, "whereFragment"); 
       } 
      } 
      ft.commit(); 
      currentFragment = whereFragment; 

ArrayList의이 조각에서 수신을 다음 모든 것이 잘 작동으로 JSONObjects의 ArrayList를이 단편에 인수로 전달됩니다.

actList = (ArrayList<JSONObject>) getArguments().getSerializable("array"); 
doingAdapter = new DoingAdapter(getActivity(), actList); 
actListView.setAdapter(doingAdapter); 

장치 카메라를 시작하는 단추가 부모 작업에 있습니다. 그 발생과 조각의 onPause 방법은 응용 프로그램이 충돌이라고하며 내 로그 캣이 오류가 발생하면

로그 캣 : I에 유래 주변에서 찾고있다 그리고 좀 보이나요

06-23 17:51:31.190: E/ACRA(29221): com.parspake.anar fatal error : Parcel: unable to marshal value {"type":"act","id":"5327f9827f49143f3a001c76","title":"خونه","actType":"where"} 
06-23 17:51:31.190: E/ACRA(29221): java.lang.RuntimeException: Parcel: unable to marshal value {"type":"act","id":"5327f9827f49143f3a001c76","title":"خونه","actType":"where"} 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeValue(Parcel.java:1235) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeList(Parcel.java:622) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeValue(Parcel.java:1195) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeMapInternal(Parcel.java:591) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Bundle.writeToParcel(Bundle.java:1619) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeBundle(Parcel.java:605) 
06-23 17:51:31.190: E/ACRA(29221): at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:132) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeTypedArray(Parcel.java:1102) 
06-23 17:51:31.190: E/ACRA(29221): at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:368) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeParcelable(Parcel.java:1254) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeValue(Parcel.java:1173) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeMapInternal(Parcel.java:591) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Bundle.writeToParcel(Bundle.java:1619) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeBundle(Parcel.java:605) 
06-23 17:51:31.190: E/ACRA(29221): at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2096) 
06-23 17:51:31.190: E/ACRA(29221): at android.app.ActivityThread$StopInfo.run(ActivityThread.java:2918) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Handler.handleCallback(Handler.java:615) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Looper.loop(Looper.java:137) 
06-23 17:51:31.190: E/ACRA(29221): at android.app.ActivityThread.main(ActivityThread.java:4827) 
06-23 17:51:31.190: E/ACRA(29221): at java.lang.reflect.Method.invokeNative(Native Method) 
06-23 17:51:31.190: E/ACRA(29221): at java.lang.reflect.Method.invoke(Method.java:511) 
06-23 17:51:31.190: E/ACRA(29221): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
06-23 17:51:31.190: E/ACRA(29221): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
06-23 17:51:31.190: E/ACRA(29221): at dalvik.system.NativeStart.main(Native Method) 

문제는 내 문제와 유사하지만, 나는 내 상황에 도움이 될 수있는 어떤 것도 가져갈 수 없습니다. 나는 그 상태를 저장하려고 시도하고있는 json 객체를 직렬화 할 수 없지만, 누군가가 내가 Serializable 또는 Parcelable 인터페이스로 작업하여 문제를 해결하도록 도울 수 있다면 좋을 것이다. 큰. 또한 다른 사람들이 제안한대로 Serializable을 조각과 활동 모두에서 구현했습니다.

답변

2

글쎄,이 일을 처리하는 방법의 표준이 아니지만 실제로 문제를 해결하고 다른 사람들을 어느 정도 도울 수 있습니다.

API에서받은 JSONArray를 JSON arraylist로 변환 한 다음 조각으로 보내는 대신 JSON 배열을 문자열로 변환하고 번들과 함께 전송했습니다.

   ft = fm.beginTransaction(); 
       if(currentFragment !=null){ 
        ft.hide(currentFragment); 
       } 
       if(doingFragment !=null){ 
        ft.show(doingFragment); 
       }else{ 
        if(mActList.size()>0){ 
        Bundle bundle = new Bundle(); 
        bundle.putString("array", jArrayWhat.toString()); 
        doingFragment = new DoingFragment(); 
        doingFragment.setArguments(bundle); 
        ft.add(R.id.newpost_container,doingFragment, "doingFragment"); 
        } 
       } 
       ft.commit(); 

단편에서 번들을 수신하여 문자열을 JSONArray로 변환했습니다.

jsonActList = new JSONArray(getArguments().getString("array")); 

그런 다음 JSONArray를 반복하여 JSONObject ArrayList로 변환했습니다. 그리고 프래그먼트가 사용 된 후에도 내 목록에 변경 사항을 적용하기 위해 ArrayList를 JSONArray로 다시 변환하여 저장했습니다. 지금은 상태가

if ((savedInstanceState != null) 
        && (savedInstanceState.getSerializable("jsonArray") != null)) { 
      jsonActList = new JSONArray(savedInstanceState.getString("jsonArray")); 
      positionList = (ArrayList<String>) savedInstanceState.getSerializable("positionList"); 
    } 

내 JSONObjects 직렬화 또는 Parcelable 만드는 문제를 처리하지 것이다이 방법을 다음과 같이 쉽게 onCreateView 방법으로 복원 할 수있는 저장되었음을

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    JSONArray jArray = new JSONArray(Arrays.asList(actList)); 
    outState.putString("jsonArray", jArray.toString()); 
} 

18

이미 필요한 데이터를 얻었 으면 번들에서 데이터를 제거하십시오.좋은 방법처럼 들린다

// get your data 
Bundle bundle = getArguments(); 
JSONObject myData = (JSONObject) bundle.getSerializable("myData"); 

// remove it 
getArguments().remove("myData"); 
+0

나는 더 이상 정렬 화 오류가 발생하지 내 번들에서 각 값을 정화하여 지금 –

+1

임 확신에 대해 그 이동하지만, 각 값이 경우에도 제거해야하는 이유 누군가가 설명해주십시오 수 번들은 읽은 후에 절대로 다시 만지지 않습니까? 아주 궁금해서! – Logic1

+0

몇 가지 활동을 시작할 때이 오류가 발생했으나이 오류가 발생했습니다. 감사합니다. –

관련 문제