2011-12-19 15 views
10

Sto usando Eclipse per imparare come funziona l'esempio SampleSyncAdapter. Non riesco a far funzionare i miei breakpoint. Ho impostato un punto di interruzione in più posizioni, ma nessuna viene colpita. Ad esempio, AuthenticatorActivity.onCreate() non viene mai chiamato. Qualcuno sa perché?SampleSyncAdapter Punti di interruzione non funzionanti

Grazie.

risposta

12

Il thread di esecuzione di SyncAdapter si verifica in un processo in background generato, non nel processo dell'applicazione stessa, che è quello a cui è collegato il java debugger.

Modo semplice e brutto: log() è tuo amico.

Modo migliore: iniziare guardando Debugging a service e scoprire se è necessario adattarlo per questo caso.

+0

Grazie sospettavo che avesse qualcosa a fare con quale processo, ma non ha avuto informazioni reali per sostenere tale ipotesi.Non ho familiarità con i debugger che si preoccupano di quale processo quando si tratta di un punto di interruzione.Io non mi piace il log() in Android.I sono abituato a molto di più registrazione sofisticata che consente a un programmatore un controllo molto più grande, inclusa la possibilità di rimuovere selettivamente il codice di registrazione nelle versioni di rilascio., grazie, guarderò il collegamento – Mitch

+8

FYI l'esempio di documentazione di SyncAdapter ha un attributo 'android: process =": ​​sync "' android nella voce del servizio nel file AndroidManifest.xml di . Durante il debug, può essere più semplice rilasciare questo attributo in modo che il servizio venga eseguito nel processo principale a cui è già collegato l'IDE. – Tobias

+0

Non sono sicuro che questa dovrebbe essere la risposta accettata –

21

In realtà, un adattatore di sincronizzazione viene eseguito nel processo in cui è configurato. La documentazione suggerisce di impostare android: process = ": sync", ma questo è solo un suggerimento. Per il debug puoi sempre rimuovere questa linea.

Per Android Studio + Gradle, si potrebbe prendere in considerazione l'aggiunta di una versione di debug del manifest in src/debug /. Si scopre che il plugin Gradle non è in grado di unire solo l'attributo android: process, quindi è necessario definire il servizio e il provider in src/release/AndroidManifest.xml e src/debug/AndroidManifest.xml separatamente in modo che non ci sia conflitto di merge.

+0

Ho tirato i miei capelli su questo. Ha funzionato per me Grazie molto! – dooleyo

+0

signore, sei un eroe – drees

+0

Questa dovrebbe essere la risposta accettata! Grazie! –

0

seguente risposta @Eric Woodruff Ho avuto questa idea che condivido per coloro che vogliono una sessione di debug in Eclipse dedicato esclusivamente alla scheda di sincronizzazione: 1. Passare alla prospettiva DDMS 2. Nel processo di device/emulatore individuare: synch (vedi foto) 3. Quindi fare clic sul pulsante di bug verde (Debug il processo selezionato: a condizione che è progetto di origine è presente e ha aperto nell'area di lavoro) enter image description here

questo funziona bene per me e mi ha un altro dare punto di vista realistico: enter image description here

2

Ho avuto questo problema e la soluzione era abbastanza semplice. Come detto prima, SyncAdapter gira su un thread diverso, quindi è necessario puntare il debugger su questo thread. Su Android Studio si aggiunge (codice qui sotto) all'interno della classe SyncAdapter:

android.os.Debug.waitForDebugger(); 

Quando sei il debug applicazione del servizio dell'adattatore di sincronizzazione non sarà in esecuzione automaticamente, in modo da avere per iniziare e poi indirizzare tale processi.

Fissare debugger per Android Processo (E 'un'icona accanto al bug verde)

Si dovrebbe funzionare bene

+0

Grazie mille! – murrayc

0
android:process=":sync" 

come indicato in altre risposte grandi opere.

Inoltre, se la tua chiamata a ContentResolver.requestSync (mAccount, AUTHORITY, settingsBundle) ha qualcosa di sbagliato, il tuo servizio non verrà chiamato senza errori. È necessario ricontrollare che la stringa di autorità corrisponda al codice manifest e xml e java.Anche l'oggetto account viene creata correttamente con il tipo di account a destra e aggiunto al AccountManager utilizzando:

accountManager.addAccountExplicitly(newAccount, null, null) 

(i nomi delle variabili sono chiamati dopo il tutorial Android ufficiale here:.

Problemi correlati