ClassNotFoundException при демаршалинге android.support.v7.widget.Toolbar$SavedState

Я вижу следующую ошибку в отчетах о сбоях Android:

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)

Кажется, это происходит периодически при возобновлении деятельности. Я не имею прямого доступа к классу SavedState ни в каком коде.

EDIT: макет Xml для моей деятельности

<?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" />
....

И XML панели инструментов

<?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"/>

И в моей деятельности onCreate я делаю

@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));
}

И я использую appcompat-v7:22.1.1, и да, я получаю эти ошибки после proguard.


person Aalap    schedule 04.05.2015    source источник
comment
Опубликуйте свой код xml и java, пожалуйста   -  person Josef    schedule 04.05.2015
comment
Добавлен мой соответствующий тестовый код в отредактированный вопрос   -  person Aalap    schedule 04.05.2015
comment
Пожалуйста, добавьте полный код Java, проблема есть в соответствии с файлом журнала.   -  person Josef    schedule 04.05.2015
comment
Какую версию appcompat-v7 вы используете?   -  person pdegand59    schedule 04.05.2015
comment
Это после прогарда?   -  person Eugen Pechanec    schedule 04.05.2015
comment
Добавлена ​​версия appcompat и да, это порт proguard   -  person Aalap    schedule 27.05.2015
comment
Добавьте свои комментарии к этой ошибке code.google.com/p/android. /issues/detail?id=175140   -  person Renjith    schedule 05.06.2015
comment
Я не использую proguard, но у меня есть эта проблема. Также я использую панель инструментов с SupportMapFragment и appcompat-v7:22.2.0. Я восстанавливаю свое приложение из фона и получаю эту ошибку во фрагменте onCreate в вызове super.onCreate().   -  person IlyaEremin    schedule 01.07.2015
comment
У меня тоже есть эта проблема. Вы когда-нибудь находили решение?   -  person Greg Ennis    schedule 26.04.2016


Ответы (3)


Похоже, следующая проблема как раз об этом: https://code.google.com/p/android/issues/detail?id=196430

person AAverin    schedule 22.05.2016
comment
Подводя итог вышеописанной проблеме с Google Code, проблема возникает только на старых устройствах (например, 2.3.7 и ниже). Лично я столкнулся с этой проблемой на устройстве с API 10 (2.3.7). Похоже, что это не будет исправлено в ближайшее время, если вообще когда-либо, для старых устройств, но было исправлено на новых устройствах, поэтому пользователи (и разработчики) ничего не могут сделать, кроме как получить более новое устройство. - person Aaron Dougherty; 21.07.2016
comment
Это не только проблема старого устройства. Это проблема состояния восстановления. Если вы возьмете более новый телефон, войдете в настройки отладки и принудительно отключите действия, вы увидите, как это происходит. Это означает, что если на вашем новом телефоне мало памяти и ему нужно отключить действия, а затем восстановить их из состояния, это не удастся. Google должен это исправить! - person lostintranslation; 06.04.2017

Согласно источнику Ааверина, Google Issue 196430 инструменты сборки версии 24 содержат исправление.

Е.Г. изменить версию инструментов сборки в build.gradle:

buildToolsVersion "24.0.0"

В качестве альтернативы можно предотвратить сбои, перехватив (в моем конкретном случае):

try {
    // Temporary fix for crash issue
    mapView.onCreate(savedInstanceState);
} catch (Throwable t) {
    t.printStackTrace();
}
person Alan    schedule 08.09.2016
comment
также в моем случае происходит сбой в mapview.oncreate(savedInstanceState), который вызывается в моем фрагменте onViewCreated(), который находится на странице просмотра - person Edijae Crusar; 11.10.2016
comment
И build tools 25 снова его ломает! - person QED; 29.10.2016

Я столкнулся с этой проблемой, когда передавал 2 объекта-притчи, один типа A, а другой типа B, содержащий объект типа A. Я передал их в разборном массиве, и моя проблема была решена.

person Deepali Maniyar    schedule 19.07.2018
comment
Намерение намерения действия 1 = новое намерение (это, R1.class); Parcelable pa[] = null;‹br/› pa = new Parcelable[3]; pa[0] = obj1; pa[1] = obj2; pa[2] = obj3; намерение.putExtra("ArrayObj", в год); Действие 2 Parcelable ArrayObj[] = намерение.getParcelableArrayExtra("ArrayObj"); s1 = (T1)ArrayObj[0]; s2 = (T2)ArrayObj[1];; - person Deepali Maniyar; 13.12.2019