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 …

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

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); } } 
  • ProgressBar en un AppWidget
  • Configuración de Android AppWidget - Comienza en una nueva tarea
  • ¿Cómo puedo actualizar correctamente AppWidget?
  • La aplicación no se muestra en la lista de aplicaciones recientes cuando se abre mediante PendingIntent
  • Widget de la aplicación: ¿puedes especificar un tamaño mínimo y un tamaño predeterminado?
  • ViewFlipper en los widgets de aplicaciones
  • ListView en el widget agrega aleatoriamente los elementos en el desplazamiento y el cambio de tamaño (vistas remotas anidadas)
  • Reemplazando RemoteViewsFactory en la actualización del widget de aplicación
  • Widget de aplicación setImageViewUri no actualiza la imagen
  • Appwidget se congela y se niega a actualizar más: ignora updateAppWidget
  • Cálculo del tamaño de Appwidget
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.