2011-12-19 18 views
10

Estoy usando Eclipse para aprender cómo funciona el ejemplo de SampleSyncAdapter. No puedo hacer funcionar mis puntos de interrupción. Establecí un punto de interrupción en varias ubicaciones, pero ninguna se golpeó. Por ejemplo, nunca se llama a AuthenticatorActivity.onCreate(). Alguien sabe por qué?SampleSyncAdapter Puntos de interrupción que no funcionan

Gracias.

Respuesta

12

El subproceso de ejecución de SyncAdapter se produce en un proceso en segundo plano engendrado, no en el proceso de su aplicación, que es a lo que tiene asociado su depurador de Java.

manera simple y fea: log() es tu amigo.

Mejor manera: comience por mirar Debugging a service y encuentre si es necesario adaptarlo para este caso.

+0

Gracias sospechaba que tenía algo que con qué proceso, pero no tenía información real para respaldar esa hipótesis. No estoy familiarizado con los depuradores que se preocupan por qué proceso cuando se trata de un punto de interrupción. Realmente no me gusta el registro() en Android. Estoy acostumbrado a un mucho más registro sofisticado que permite a un programador un control mucho mayor, incluida la capacidad de eliminar selectivamente el código de registro en las versiones de lanzamiento. Gracias, miraré el enlace. – Mitch

+8

FYI el ejemplo de documentación de SyncAdapter tiene un atributo 'android: process =": ​​sync "' en la entrada del Servicio en AndroidManifest.xml. Durante la depuración, puede ser más fácil descartar este atributo para que el servicio se ejecute en su proceso principal al que su IDE ya está conectado. – Tobias

+0

No estoy seguro de que esta sea la respuesta aceptada –

21

En realidad, un adaptador de sincronización se ejecuta en el proceso en el que está configurado. La documentación sugiere configurar android: process = ": sync", pero eso es solo una sugerencia. Para la depuración, siempre puedes eliminar esta línea.

Para Android Studio + Gradle, puede considerar agregar una versión de depuración del manifiesto en src/debug /. Resulta que el complemento de Gradle no puede fusionarse solo en el atributo android: process, por lo que debe definir el servicio y el proveedor en src/release/AndroidManifest.xml y src/debug/AndroidManifest.xml por separado para que no haya conflicto de fusión.

+0

He estado tirando de mi pelo en este caso. Trabajó para mi. ¡Muchas gracias! – dooleyo

+0

usted señor, es un héroe – drees

+0

¡Esta debería ser la respuesta aceptada! ¡Gracias! –

0

siguiente respuesta @Eric Woodruff me dio esta idea que comparto para aquellos que quieren una sesión de depuración en Eclipse dedicado exclusivamente al adaptador de sincronización: 1. Cambiar a DDMS perspectiva 2. En el proceso de dispositivo/emulador localizar: sincronización (ver la imagen) 3. a continuación, haga clic en el botón de funcionamiento verde (Depurar el proceso seleccionado: siempre y cuando sea proyecto de código está presente y se abre en el espacio de trabajo) enter image description here

esto funciona muy bien para mí y una más dar punto de vista realista: enter image description here

2

Tuve este problema y la solución fue bastante simple. Como se dijo anteriormente, SyncAdapter se ejecuta en un hilo diferente, por lo que debe apuntar el depurador a este hilo. En Android Studio añadir (por debajo de código) dentro de la clase SyncAdapter:

android.os.Debug.waitForDebugger(); 

Cuando estás depuración de la aplicación del servicio de adaptador de sincronización no se ejecuta de forma automática, por lo que tiene que empezar y luego apuntar que proceso.

Acople depurador para Android Proceso (Es un icono junto al bicho verde)

Se debería funcionar bien

+0

¡Muchas gracias! – murrayc

0
android:process=":sync" 

como se da en otras respuestas funciona muy bien.

Además de eso, si su llamada a ContentResolver.requestSync (mAccount, AUTHORITY, settingsBundle) tiene algún problema, su servicio no se ejecutará sin ningún error. Debe verificar nuevamente que la cadena de Autoridad coincida en el manifiesto y xml, y el código de java.También el objeto de cuenta se crea correctamente con el tipo de cuenta correcto y se añade al administrador de cuentas usando:

accountManager.addAccountExplicitly(newAccount, null, null) 

(los nombres de las variables tienen el nombre de la clase particular androide oficial here:.

Cuestiones relacionadas