studio segundo plano notification notificaciones hacer example create como android notifications runtimeexception

segundo - notification channel android



Notificación personalizada: java.lang.RuntimeException: longitudes de matriz incorrectas (2)

Estoy tratando de usar notificaciones personalizadas en mi aplicación de Android usando la muestra de Google desde here (en la sección Creación de un diseño de notificación personalizado ). Dado que estoy usando este código exacto, recibí una RuntimeException cada pocas veces que se dispara una notificación.

Mi rastro de pila:

FATAL EXCEPTION: main java.lang.RuntimeException: bad array lengths at android.os.Parcel.readIntArray(Parcel.java:677) at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag(INotificationManager.java:369) at android.app.NotificationManager.notify(NotificationManager.java:110) at android.app.NotificationManager.notify(NotificationManager.java:90) at com.****.service.UpdateFeedService.notifyUpdateProgress(UpdateFeedService.java:266) at com.****.service.task.PodcastUpdaterTask.onProgressUpdate(PodcastUpdaterTask.java:63) at com.****.service.task.PodcastUpdaterTask.onProgressUpdate(PodcastUpdaterTask.java:1) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:432) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:144) at android.app.ActivityThread.main(ActivityThread.java:4937) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) at dalvik.system.NativeStart.main(Native Method)

Mi código:

private final Intent updateInProgressIntent = new Intent(this.context, PodcastListActivity.class); private RemoteViews updateInProgressContentView = null; private PendingIntent updateInProgressPendingIntent = null; private Notification updateInProgressNotification = null; ... @Override public void onCreate() { super.onCreate(); ... this.updateInProgressPendingIntent = PendingIntent.getActivity(this, UPDATE_INPROGRESS_NOTIFICATION_ID, this.updateInProgressIntent, PendingIntent.FLAG_UPDATE_CURRENT); this.updateInProgressContentView = new RemoteViews(getPackageName(), R.layout.custom_notification); ... } public void notifyUpdateProgress(final int index, final int size, final Podcast podcast) { this.updateInProgressContentView.setImageViewBitmap( R.id.image, ActivityHelper.getBitmap(context, podcast.getThumbnailAsset())); this.updateInProgressContentView.setTextViewText(R.id.title, "some msg"); this.updateInProgressContentView.setTextViewText(R.id.text, podcast.getName()); this.updateInProgressNotification.contentView = this.updateInProgressContentView; this.updateInProgressNotification.contentIntent = this.updateInProgressPendingIntent; this.notificationManager.notify(UPDATE_INPROGRESS_NOTIFICATION_ID, this.updateInProgressNotification); ... }

Si sustituyo la notificación personalizada por una estándar (con setLatestEventInfo() ) no tengo problemas.


Ok, así que finalmente encuentro la solución.

¡No puedes reutilizar el mismo objeto RemoteView como lo hice yo!

Estaba creando RemoteView en el método onCreate() , luego estaba configurando sus atributos en notifyUpdateProgress() .

Si creo el objeto en notifyUpdateProgress() justo antes de usarlo, ya no tendré la excepción.


Si está viendo este problema, investigue el tamaño del mapa de bits que está utilizando para la imagen de notificación.

Si es demasiado grande, puede ver este error, así como un OutOfMemoryError en el lado del sistema Android.