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 para la aplicación de chat
- onclicklistener en el elemento específico de la recyclerview en android
- RecyclerView.ViewHolder - getLayoutPosition vs getAdapterPosition
- Escaneando con múltiples RecyclerViews en Layout
- RecyclerView sin barra de desplazamiento cuando se desactiva el desplazamiento excesivo
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>
- RecyclerView corrompe la vista usando notifyItemMoved ()
- ¿Cómo saber cuando el RecyclerView ha terminado de colocar los artículos?
- Establecer contentInset en RecyclerView
- Los métodos onCreateViewHolder y onBindViewHolder de RecyclerView.Adapter no se reciben
- Cómo ordenar recylerview por el número más bajo / String android studio
- Cómo agregar la vista de reciclar en el diseño xml
- Obtener el elemento visible en el centro de RecycleView al desplazarse
- RecyclerView Preguntas y Respuestas
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