Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Appwidget se congela y se niega a actualizar más: ignora updateAppWidget

Así que tengo un widget de aplicación que es refrescante muy bien, la carga de un nuevo mapa de bits en un ImageView regularmente como mecanismo de relojería. Entonces, en algún momento, y en silencio, dejará de actualizar más adelante. Puedo decir desde el registro, y de la actividad en un servidor que mi código está preguntando, que el widget es en realidad todavía sigue disparando regularmente (a través de las emisiones capturadas por onReceive() , y haciendo sus cosas como se espera. 'Sucede t es que el contenido del widget no se está actualizando.

Por lo tanto, en el código que se ejecuta cuando se dispara el widget, estoy creando un nuevo RemoteViews y añadir cosas a él, incluyendo la carga de un nuevo mapa de bits a través de remoteViews.setImageViewBitmap(imageViewID, bmp) , y finalmente llamando appWidgetManager.updateAppWidget(appWidgetId, remoteViews) para actualizar el contenido del widget. Funciona muy bien … hasta que deja de funcionar.

No estoy seguro de qué código publicar, porque la cosa funciona bien el 99% del tiempo, pero de vez en cuando el updateAppWidget() deja de funcionar, sin razón aparente. Parece que es un problema del sistema, en lugar de un error en mi código, pero podría estar equivocado.

Lo único que parece que tal vez pedir esto es cuando hay cambios en la conectividad, por ejemplo, ir de ninguna señal a WiFi, tal vez frecuentes tales cambios. Parece ocurrir más en esas situaciones.

Y una vez que el widget se congela, lo único que lo desbloquea es reiniciar el dispositivo. Sin reiniciar, incluso eliminar el widget y agregar uno nuevo no funciona. De hecho, agregar uno nuevo resulta en un widget muerto que ni siquiera responde a un clic para abrir la actividad de configuración, presumiblemente porque remoteViews.setOnClickPendingIntent(R.id.widget, configPendingIntent) se ignora como todo lo demás en RemoteViews Construyo y envío cuidadosamente a appWidgetManager.updateAppWidget() .

Parece ser bastante parecido a lo descrito por muchos otros aquí:

Https://code.google.com/p/android/issues/detail?id=28216

Y todavía no parece haber curación conocida. La publicación en https://code.google.com/p/android/issues/detail?id=28216#c56 parecía ofrecer alguna promesa, pero he intentado llamar a AppWidgetHost.startListening() en varios lugares, incluyendo a regular Intervalos a través de una alarma de repetición para ver si podía kickstart el widget, pero nada parece funcionar.

Y otros usuarios (en lugar de desarrolladores) parecen ver este problema también:

¿Algunas ideas? ¡Me está volviendo loco!

One Solution collect form web for “Appwidget se congela y se niega a actualizar más: ignora updateAppWidget”

 remoteViews.setImageViewBitmap(imageViewID, bmp) 

No lo hagas. Haciendo esto envía el mapa de bits y envía la cosa entera como una transacción del cuaderno. Binders están destinados a transferir una pequeña cantidad de datos y no manejan mapas de bits. Incluso cuando el widget mantiene la actualización, está utilizando más recursos del sistema de los necesarios, y más recursos del lanzador (el lanzador tiene que unparcel el mapa de bits, por lo menos almacenar temporalmente los bytes parcelados y el unparceled, y tiene que ser hecho en el hilo de UI Pero el problema que está viendo es el error que enlazó, a veces las transacciones de encuadernación grandes desencadenan una TransactionTooLargeException y el AppWidgetManagerService maneja incorrectamente esto deteniendo todas las actualizaciones futuras (a veces a todos los widgets, a veces sólo a los suyos).

En su lugar, debe utilizar setImageViewUri https://developer.android.com/reference/android/widget/RemoteViews.html#setImageViewUri(int,%20android.net.Uri) . Es un poco más trabajo porque usted necesita para guardar el mapa de bits y luego enviar el lanzador un uri para él, aunque actualmente todos o casi todos los lanzadores tienen READ_EXTERNAL_STORAGE por lo que un file:/// uri al almacenamiento externo podría funcionar, no debe confiar en Que en el futuro y en su lugar debería utilizar un FileProvider https://developer.android.com/reference/android/support/v4/content/FileProvider.html

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.