Cómo (y dónde) fijar android.os.BadParcelableException: ClassNotFoundException cuando unmarshalling: RecyclerView $ SavedState?
He estado recibiendo por debajo de la excepción en la producción de AP de mi androide apk durante 1 día ahora:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ab/com.abcdHomeActivity}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.v7.widget.RecyclerView$SavedState at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1654) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1670) at android.app.ActivityThread.access$1500(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3695) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) at dalvik.system.NativeStart.main(Native Method) Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.v7.widget.RecyclerView$SavedState at android.os.Parcel.readParcelable(Parcel.java:1958) at android.os.Parcel.readValue(Parcel.java:1846) at android.os.Parcel.readSparseArrayInternal(Parcel.java:2112) at android.os.Parcel.readSparseArray(Parcel.java:1568) at android.os.Parcel.readValue(Parcel.java:1903) at android.os.Parcel.readMapInternal(Parcel.java:2083) at android.os.Bundle.unparcel(Bundle.java:208) at android.os.Bundle.getSparseParcelableArray(Bundle.java:1167) at android.support.design.internal.NavigationMenuPresenter.onRestoreInstanceState(Unknown Source) at android.support.v7.view.menu.i.dispatchRestoreInstanceState(Unknown Source) at android.support.v7.view.menu.i.restorePresenterStates(Unknown Source) at android.support.design.widget.NavigationView.onRestoreInstanceState(Unknown Source) at android.view.View.dispatchRestoreInstanceState(View.java:6287) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1211) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1215) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1215) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1215) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1215) at android.view.View.restoreHierarchyState(View.java:6266) at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1506) at android.app.Activity.onRestoreInstanceState(Activity.java:847) at android.app.Activity.performRestoreInstanceState(Activity.java:819) at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1096) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1632) ... 11 more
Todos los informes de fallos anteriores son de Android 2.3.3 – versiones 2.3.7. No estoy seguro de lo que está causando esto.
- RecyclerView eliminar el bug de animación
- La vista en RecyclerView no coincide con el ancho de los padres
- Espresso, el desplazamiento no funciona cuando NestedScrollView o RecyclerView está en CoordinatorLayout
- Seleccione sólo un botón de radio en una vista de reciclaje
- RecyclerView LayoutManager cuenta con diferentes rangos en diferentes filas
He buscado otros puestos similares, pero las respuestas fueron alrededor de un objeto personalizado que implementa parcelable que no implementar en mi aplicación.
Estoy usando la última versión de la biblioteca de soporte de android y servicios de reproducción en mi aplicación como se muestra a continuación:
compile 'com.android.support:cardview-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.google.android.gms:play-services-analytics:8.4.0' compile 'com.google.android.gms:play-services-ads:8.4.0' compile 'com.google.android.gms:play-services-appinvite:8.4.0' compile 'com.google.android.gms:play-services-plus:8.4.0'
Aquí está el código (que me siento relevante, si no, por favor, hágamelo saber qué más se necesita) de la actividad que está fallando:
private void initNavigationMenu() { mNavigationView = (NavigationView) findViewById(R.id.nav_view); mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { return onNavItemSelected(menuItem); } }); Menu menu = mNavigationView.getMenu(); MenuItem menuItem = menu.findItem(R.id.action_tutorial); IconDrawable iconDrawable = new IconDrawable(this, MaterialIcons.md_ondemand_video) .colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_settings); iconDrawable = new IconDrawable(this, MaterialIcons.md_settings).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_images_all); iconDrawable = new IconDrawable(this, EntypoIcons.entypo_images).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_images_screenshots); iconDrawable = new IconDrawable(this, MaterialIcons.md_camera).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_favorites); iconDrawable = new IconDrawable(this, MaterialIcons.md_favorite).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_translate); iconDrawable = new IconDrawable(this, MaterialIcons.md_translate).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_feedback); iconDrawable = new IconDrawable(this, MaterialIcons.md_feedback).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_rate); iconDrawable = new IconDrawable(this, MaterialIcons.md_rate_review).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_invite); iconDrawable = new IconDrawable(this, MaterialIcons.md_insert_invitation).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_facebook); iconDrawable = new IconDrawable(this, FontAwesomeIcons.fa_facebook).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_twitter); iconDrawable = new IconDrawable(this, FontAwesomeIcons.fa_twitter).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_google_plus); iconDrawable = new IconDrawable(this, FontAwesomeIcons.fa_google_plus).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem = menu.findItem(R.id.action_remove_ads); iconDrawable = new IconDrawable(this, MaterialIcons.md_attach_money).colorRes(R.color.black); menuItem.setIcon(iconDrawable); menuItem.setVisible(!BuildConfig.IS_PRO); setHeaderView(); } private void setHeaderView() { boolean initializePlusOneButton = false; GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); int code = googleApiAvailability.isGooglePlayServicesAvailable(this); if (code == ConnectionResult.SUCCESS) { initializePlusOneButton = true; } else if (googleApiAvailability.isUserResolvableError(code)) { googleApiAvailability.showErrorDialogFragment(this, code, REQ_CODE_GOOGLE_API_ERROR); } View headerView = LayoutInflater.from(this).inflate( initializePlusOneButton ? R.layout.activity_home_drawer_header : R.layout.activity_home_drawer_header_wo_plus_button, null); if (initializePlusOneButton) { mPlusOneButton = (PlusOneButton) headerView.findViewById(R.id.plus_one_button); } mNavigationView.addHeaderView(headerView); gLogger.debug(String.format( "setHeaderView(): initialize plusOneButton=%s", initializePlusOneButton )); }
Contenido de R.layout.activity_home_drawer_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="150dp" android:background="?attr/colorPrimary" android:orientation="vertical"> <com.andexert.library.RippleView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="bottom" android:padding="10dp" app:rv_rippleDuration="300" app:rv_type="rectangle"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <com.joanzapata.iconify.widget.IconTextView android:layout_width="60dp" android:layout_height="match_parent" android:layout_above="@+id/app_name" android:layout_gravity="center_vertical" android:gravity="center" android:text="{md-camera}" android:textColor="@color/white" android:textSize="50sp" /> <LinearLayout android:layout_width="0dip" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:orientation="vertical" android:padding="10dp"> <TextView android:id="@+id/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="10dp" android:layout_marginTop="5dp" android:text="@string/app_name" android:textColor="@color/white" android:textSize="16sp" android:textStyle="italic|bold" /> <com.google.android.gms.plus.PlusOneButton xmlns:plus="http://schemas.android.com/apk/lib/com.google.android.gms.plus" android:id="@+id/plus_one_button" android:layout_width="wrap_content" android:layout_height="wrap_content" plus:annotation="bubble" plus:size="medium" /> </LinearLayout> </LinearLayout> </com.andexert.library.RippleView> </LinearLayout>
Contenido de R.layout.activity_home_drawer_header_wo_plus_button.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="150dp" android:background="?attr/colorPrimary" android:orientation="vertical"> <com.andexert.library.RippleView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="bottom" android:padding="10dp" app:rv_rippleDuration="300" app:rv_type="rectangle"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.joanzapata.iconify.widget.IconTextView android:layout_width="wrap_content" android:padding="10dp" android:layout_above="@+id/app_name" android:layout_weight="1" android:layout_gravity="center" android:gravity="center" android:layout_height="0dip" android:text="{md-camera}" android:textColor="@color/white" android:textSize="80sp" /> <TextView android:id="@+id/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" android:text="@string/app_name" android:textColor="@color/white" android:textSize="18sp" android:textStyle="italic|bold" /> </LinearLayout> </com.andexert.library.RippleView> </LinearLayout>
- Algoritmo de reutilización de RecyclerView
- RecyclerView no se desplaza
- RecyclerView sin barra de desplazamiento cuando se desactiva el desplazamiento excesivo
- Variable número de columnas en GridLayoutManager
- Inicio de DialogFragment desde una clase que se extiende RecyclerView.ViewHolder
- Fragmentos duplicados con RecyclerView que aparecen en ViewPager después de pasar
- NestedScrollview no comenzará desde arriba
- El evento RecyclerView onScrollStateChanged / onScrolled no se activa cuando no se ha producido desplazamiento
Se ha abierto un ticket en bugs.google.com y para API 11+
se ha corregido en la biblioteca de asistencia 24.0.0
. Para API <= 10
se fijará en una versión futura.
Sea cual sea la View
da error, use android:saveEnabled="false"
en la declaración xml de esa vista o yourView.setSaveEnabled(false)
programación. De esta manera se evita guardar el estado de esa vista (cuando se cancela el proceso de aplicación) y no se bloquea en el momento de la restauración.
- Creación de la notificación de InstrumentationTestCase
- Android: implementación de la compatibilidad con el paquete de iconos