2012-02-13 10 views
8

Implementé SyncAdapter, AccountManager y ContentProvider privado a lo largo de las líneas del proyecto de ejemplo SimpleSyncAdapter en el SDK. Todo está funcionando bien.Android SyncAdapter Callback

Ahora quiero mostrar un mensaje al usuario cuando se han descargado nuevas filas desde el servidor remoto que tiene un conjunto de banderas específico. Necesito una devolución de llamada desde SyncAdapter cuando haya finalizado una sincronización para poder hacer la consulta y mostrar el mensaje de una actividad. He visto algunas preguntas sobre StackOverflow discutiendo esto pero ninguna con una buena respuesta.

How does one listen for progress from Android SyncAdapter? dice que SyncStatusObserver es inútil. El usuario mobibob sugiere usar un ResultReceiver para responder a la interfaz de usuario desde el hilo de sincronización.

How to know when sync is finished? sugiere usar un Intent en su SyncService.

How to signal sync-complete to the Android SyncManager? sugiere utilizar SyncResult. El código de ejemplo vinculado por maxpower47 usa la clase SyncResult para informar excepciones pero no para informar realmente si una sincronización se completó con éxito.

Simplemente no sé cuál es la mejor opción y no he visto ningún proyecto de ejemplo en el que se utilicen estas soluciones.

+0

Exactamente en la misma posición: ¿logró resolverlo? – HGPB

Respuesta

1

Sé que esta es una vieja pregunta, pero yo mismo preguntaba lo mismo. Lo que descubrí como una buena solución, especialmente porque estoy tratando con datos locales como eres, es utilizar el siguiente método de ContentResolver:

registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer) 

este registro una clase observador que llegar devolución de llamada cuando se identifican los datos por un contenido dado URI cambia. Pero eso solo puede suceder si su proveedor de contenido envía la notificación. Así, por ejemplo, si desea ser notificado sobre la ContentObserver arriba para todas las actualizaciones hechas en su base de datos a través de un ContentProvider, su ContentProvider debe implementar la actualización similar a esto:

@Override 
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) { 
    // code goes here 
    this.getContext().getContentResolver().notifyChange(uri, null); 
    return 0; 
} 

Usando notifyForDescendents cuando se hace una registerContentObserver puede ser muy útil.

1

Esta es una vieja pregunta, pero investigué un poco en los últimos días y no hay muchos ejemplos de cómo SyncAdapter maneja las solicitudes de red y notifica a la UI.

En primer lugar, debe utilizar los cargadores con contentProvider para hacer su vida más fácil. Ya no es necesario que se registre para la resolución de contenido, el cargador lo hace por usted. Por lo tanto, significa que su UI recibe una notificación por todo lo que ingrese en su proveedor de contenido.

¿Qué pasa si nada ha cambiado? todo estaba actualizado o tuviste un error de red.

  1. Puede escuchar el estado de su SyncAdapter como el Google I/O aplicación hace, buscar mSyncStatusObserver en el BaseActivity
  2. tuve un vistazo a la aplicación de correo electrónico por defecto de Android y utilizar un Singleton con callBacks.
  3. Puede BroadcastIntents o use un eventBus (Otto cuadrado por ejemplo) para notificar a su UI de cualquier comportamiento.

Me gusta el último mejor porque le da más granularidad en los eventos que ocurren en el adaptador de sincronización.

+0

¿Tiene algún ejemplo del uso de Otto con SyncAdapter? – toobsco42

+0

Lo siento, actualmente no tengo uno, tengo un [proyecto de muestra] (https://github.com/sebastienrouif/notesSyncAdapter) donde en el SyncHelper.java, además de atrapar los errores, puede enviar errores de eventos. En el lado de UI es un manejo de eventos regular. – Sebastien

+0

brillante Sebastien !! +1 –

-2

Nos encontramos con una situación similar y escribimos una interfaz de Escucha estática para SyncAdapter. El oyente es la actividad y realiza las acciones necesarias cuando los datos están disponibles (UI de actualización). Esto también funciona cuando el sistema llama al adaptador-sincronización durante la sincronización automática, donde este oyente sería nulo y al proceso de sincronización le importaría su propio negocio.

class SyncAdapter extends AbstractThreadedSyncAdapter { 

    protected static Listener uiListener = null; 
    public interface Listener { 
     public void onSync(); 
    } 
    public static void setListener(Listener l) { 
     uiListener = l; 
    } 
    public static void clearListener() { 
     uiListener = null; 
    } 
    protected void broadcastSync() { 
     if (uiListener != null) 
      uiListener.onSync(); 
    } 
    public void onPerformSync(Account account, Bundle extras, String authority, 
          ContentProviderClient provider, SyncResult syncResult) { 

     // call broadcastSync(); 
    } 

Luego, en la actividad, ejecutar SyncAdapter.Listener interfaz.