Android operación de larga duración para actualizar un appwidget
Tengo un widget que necesita para realizar una operación potencialmente larga en onUpdate (). Sólo la realización de la operación resultó directamente en ANR. Para resolver esto, mi primer intento fue crear un hilo en él. Me di cuenta de que el widget no se actualizaría en algunos casos. Mi conjetura aquí es que una vez onUpdate () sale, android puede matar el proceso junto con el hilo sin terminar.
Mi siguiente intento fue crear un servicio de intención. El onUpdate () del widget solo inicia el servicio de intención, que hace el trabajo directamente y actualiza el widget cuando se hace. Esto funciona, pero para mi sorpresa, parece que onHandleIntent () es único roscado. Si tengo dos widgets, y luego actualizar y iniciar el servicio de intención, se actualizan secuencialmente …
- Manejo de varias instancias de appwidget
- Tamaño incorrecto de la cuadrícula del widget
- AppWidget no se muestra en la lista de widgets de lanzador en dispositivos de lollipop solamente
- Widget de la aplicación en Android con conexión de red
- ¿Cómo evitar que los viejos widgets desaparezcan durante la repetición de código mayor?
El caso de dos widgets no es realmente importante, pero me estoy preguntando acerca de una mejor práctica para este tipo de patrón.
Para resolver el caso de dos widgets terminé actualizando todas las instancias de widget con los mismos datos cuando se hace clic en cualquiera de ellos. Ej., Ejecuto el proceso de ejecución larga una vez y aplico los resultados a todas las instancias del widget. En mi caso esto no importa, pero para muchos widgets podría ser importante no hacerlo.
Pensamientos
- Creando un appwidget android ListView for SDK 8?
- Múltiples tamaños de widgets
- Widget para encender / apagar la linterna de la cámara en android
- Conserve la relación de aspecto de la imagen en el widget de aplicación GridView
- Utilizar two pendingIntent en una vista en Appwidget
- Cómo ocultar vistas parcialmente visibles en Android xml layout sin código?
- Problemas con appwidget appWidgetIds (instancias reales y fantasmas de widget)
- Actualizar el widget de la aplicación en un clic en android
Pero para mi sorpresa, parece que onHandleIntent () es único threaded
Sí.
Si tengo dos widgets, y luego actualizar y iniciar el servicio de intención, se actualizan secuencialmente …
Sí.
Pero me estoy preguntando acerca de una mejor práctica para este tipo de patrón.
Su IntentService
fue una excelente solución, IMHO. Recuerde que Android se ejecuta en CPUs lentas, con dispositivos con poca RAM. Correr lotes de hilos en paralelo generalmente no es una buena idea.
Entonces me estoy poniendo en iniciar un hilo en onHandleIntent (), que requiere un bloqueo de la estela, y parece que se está poniendo demasiado complicado.
Prueba mi WakefulIntentService
.
Haga que onUpdate llame a su propia función para recorrer los widgets y actualizarlos. Realice su tarea asíncrona antes del ciclo. Usted querrá dos acciones separadas, una que pide que la actualización comience y una que su IntentService
difundirá para permitir que los widgets sepan que han terminado. Espero que esto ayude.
@Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { updateWidget(context, appWidgetManager, appWidgetIds); } private void updateWidget(Context context){ ComponentName widget = new ComponentName(context, MyWidget.class); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(widget); updateWidget(context, appWidgetManager, appWidgetIds); } private void updateWidget(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { final boolean isEnabled = true; //took out code didn't want you to see // start intent service here for(int i = 0; i< appWidgetIds.length; i++){ int appWidgetId = appWidgetIds[i]; Intent intent = new Intent(isEnabled ? ACTION_TOGGLE_OFF : ACTION_TOGGLE_ON); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); views.setOnClickPendingIntent(R.id.widget , pi); views.setImageViewResource(R.id.widget_image, isEnabled? R.drawable.widget_on : R.drawable.widget_off); appWidgetManager.updateAppWidget(appWidgetId, views); } }
- ¿Cuál es el archivo .driver-metadata utilizado en Android Things?
- Adición de dependencias de biblioteca de terceros a Android Library