16

widzę następujący błąd w moich Android raportów o awariach:

android.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.v7.widget.Toolbar$SavedState 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2318) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396) 
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3974) 
    at android.app.ActivityThread.access$900(ActivityThread.java:139) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1299) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:149) 
    at android.app.ActivityThread.main(ActivityThread.java:5257) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
    at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.v7.widget.Toolbar$SavedState 
    at android.os.Parcel.readParcelableCreator(Parcel.java:2154) 
    at android.os.Parcel.readParcelable(Parcel.java:2104) 
    at android.os.Parcel.readValue(Parcel.java:2020) 
    at android.os.Parcel.readSparseArrayInternal(Parcel.java:2382) 
    at android.os.Parcel.readSparseArray(Parcel.java:1742) 
    at android.os.Parcel.readValue(Parcel.java:2077) 
    at android.os.Parcel.readArrayMapInternal(Parcel.java:2321) 
    at android.os.Bundle.unparcel(Bundle.java:249) 
    at android.os.Bundle.getSparseParcelableArray(Bundle.java:1273) 
    at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1744) 
    at android.app.Activity.onRestoreInstanceState(Activity.java:1017) 
    at android.app.Activity.performRestoreInstanceState(Activity.java:989) 
    at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1138) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2284) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396) 
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3974) 
    at android.app.ActivityThread.access$900(ActivityThread.java:139) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1299) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:149) 
    at android.app.ActivityThread.main(ActivityThread.java:5257) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
    at dalvik.system.NativeStart.main(NativeStart.java) 

Wydaje się zdarzyć sporadycznie po wznowieniu działalności. Nie uzyskuję bezpośredniego dostępu do klasy SavedState w żadnym kodzie.

EDIT: XML szablonu dla mojej działalności jest

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/white" 
android:orientation="vertical"> 

<include layout="@layout/toolbar" /> 
.... 

i pasek narzędzi XML jest

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/toolbar" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="?attr/colorPrimary" 
android:minHeight="?attr/actionBarSize" 
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 

I w moim onCreate Działania związane jest zrobić

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_show_txn); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    localBroadcastManager = LocalBroadcastManager.getInstance(getApplicationContext()); 
    mResources = getResources(); 

    if (savedInstanceState != null) { 
     long id = savedInstanceState.getLong(STA_TXN_ID); 
     ... 
    } else { 
     ... read fresh 
    } 

    mDateTV = (TextView) findViewById(R.id.ASTVDate); 
    mDayTV = (TextView) findViewById(R.id.ASTVDay); 
    mCatName = (TextView) findViewById(R.id.ASTVCatName); 
    mMonthTV = (TextView) findViewById(R.id.ASTVMonth); 
    .... 

    Calendar c = java.util.Calendar.getInstance(); 
    c.setTime(txn.getTxnDate()); 
    mDateTV.setText("" + c.get(Calendar.DAY_OF_MONTH)); 
    mDayTV.setText(c.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US)); 
    mMonthTV.setText(c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.US)); 
} 

I mam Używałem appcompat-v7: 22.1.1 i tak, I g i te błędy po proguardzie.

+0

Wyślij swój kod XML i Java pls – Josef

+0

Dodano moja istotne kod testowy w edytowanym kwerencie – Aalap

+0

Pls dodać pełny kod Java, problem jest tam zgodnie z plikiem dziennika – Josef

Odpowiedz

2

Wygląda następujący problem jest dokładnie o tym: https://code.google.com/p/android/issues/detail?id=196430

+0

Podsumowując powyższy problem Google Code, problem wydaje się występować tylko na starszych urządzeniach (czyli w wersji 2.3.7 i niższych). Osobiście wpadłem na ten problem na urządzeniu z uruchomionym API 10 (2.3.7). Wygląda na to, że nie zostanie to naprawione w najbliższym czasie, jeśli w ogóle, w przypadku starszych urządzeń, ale zostało naprawione na nowszych urządzeniach, więc nic użytkownicy (ani programiści) nie mogą sobie pozwolić na uzyskanie nowszego urządzenia. –

+2

To nie tylko starszy problem z urządzeniem. Jest to problem z przywróceniem stanu. Jeśli weźmiesz nowszy telefon, przejdź do ustawień debugowania i wymuś działania, aby zawsze być zabity, zobaczysz to. Oznacza to, że jeśli nowszy telefon ma mało pamięci i musi wyłączyć działania, a następnie przywrócić je z stanu, to się nie powiedzie. Google musi to naprawić! – lostintranslation

1

Według źródła AAverin'S, Google Issue 196430, budować narzędzia wersja 24 zawiera poprawkę.

E.G. zmienić wersję narzędzia budować w build.gradle:

buildToolsVersion "24.0.0" 

Alternatywnie, zapobiegać awariom, wzrok (w moim przypadku):

try { 
    // Temporary fix for crash issue 
    mapView.onCreate(savedInstanceState); 
} catch (Throwable t) { 
    t.printStackTrace(); 
} 
+0

również w moim przypadku jest to crash w 'mapview.oncreate (savedInstanceState)', które jest wywoływane w 'moim widoku' onViewCreated() ', który jest w viewpager –

+1

I budowania narzędzi 25 ponownie go! – QED

Powiązane problemy