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); } } 
  • Eliminación de AppWidgets mediante programación
  • El widget no aparece en la lista de widgets
  • Cómo cambiar el atributo 'android: autoStart' de ViewFlipper en RemoteViews mediante programación?
  • OnGetViewFactory sólo se llama una vez para varios widgets
  • ¿Cómo puedo crear un widget de aplicación de paginación de Android compatible con versiones anteriores?
  • Ajustar el fondo de AppWidget para un widget afecta a otros también
  • Calcular altura de appwidget
  • Cómo cambiar el tamaño del texto en función del tamaño del widget en un textview en un appwidget?
  • Widget de la aplicación: ¿puedes especificar un tamaño mínimo y un tamaño predeterminado?
  • ListView en el widget agrega aleatoriamente los elementos en el desplazamiento y el cambio de tamaño (vistas remotas anidadas)
  • Obtener el widget actualmente activo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.