2011-12-19 14 views
10

Używam Eclipse, aby dowiedzieć się, jak działa przykład SampleSyncAdapter. Nie mogę dostać swoich breakpointów do działania. Ustawiłem punkt przerwania w wielu lokalizacjach, ale żaden nie został trafiony. Na przykład funkcja AuthenticatorActivity.onCreate() nigdy nie jest wywoływana. Ktoś wie dlaczego?Punkty przerw SampleSyncAdapter Nie działa

Dzięki.

Odpowiedz

12

Wątek wykonywania SyncAdapter występuje w procesie z odrodzeniem tła, a nie w procesie samej aplikacji, do której jest dołączony debugger języka Java.

Prosty i brzydki sposób: log() jest twoim przyjacielem.

Lepszy sposób: Zacznij od przyjrzenia się Debugging a service i sprawdź, czy wymaga to dostosowania w tym przypadku.

+0

Dzięki Podejrzewałem, że miał coś wspólnego z jakim procesem, ale nie ma faktycznych informacji do poparcia tej hipotezy.Nie jestem obeznany z debuggery, które dbają o tym, który proces, jeśli chodzi o punkt przerwania.Naprawdę nie podoba mi się log() w systemie Android. Jestem przyzwyczajony do znacznie więcej wyrafinowane logowanie, które pozwala programistom na znacznie większą kontrolę, w tym możliwość selektywnego usuwania kodu logowania w kompilacjach wydań.Dzięki, spoglądam na link: – Mitch

+8

FYI przykład dokumentacji SyncAdapter ma atrybut "android: process =": ​​sync " " we wpisie usługi w pliku AndroidManifest.xml. Podczas debugowania może być łatwiej upuścić ten atrybut, aby usługa działała w głównym procesie, do którego IDE jest już dołączone. – Tobias

+0

Nie jestem pewien, czy to powinna być akceptowana odpowiedź. –

21

W rzeczywistości adapter synchronizacji działa w procesie, w którym jest skonfigurowany. Dokumentacja sugeruje ustawienie android: process = ": sync", ale to tylko sugestia. W przypadku debugowania zawsze możesz usunąć tę linię.

W przypadku systemu Android Studio + Gradle można rozważyć dodanie wersji debugowania pliku manifestu w src/debug /. Okazuje się, że wtyczka Gradle nie jest w stanie scalić tylko atrybutu android: process, więc musisz zdefiniować usługę i dostawcę w src/release/AndroidManifest.xml i src/debug/AndroidManifest.xml oddzielnie, aby nie było konfliktu między połączeniami.

+0

Wyciągam włosy z tego. Pracował dla mnie. Wielkie dzięki! – dooleyo

+0

Ty jesteś, jesteś bohaterem. – drees

+0

To powinna być zaakceptowana odpowiedź! Dzięki! –

0

Po @Eric Woodruff odpowiedź Mam ten pomysł, że mogę podzielić na tych, którzy chcą się sesja debugowania w Eclipse dedykowana wyłącznie do synchronizacji adaptera: 1. Przełącznik do DDMS perspektywy 2. W procesie urządzenie/emulatora zlokalizowania: odświeżania (patrz rysunek) 3. Następnie kliknij na przycisk zielony bug (Debug wybrany proces: pod warunkiem, że to projekt źródłowy jest obecny i otwarty w przestrzeni roboczej) enter image description here

to działa dobrze dla mnie i daj mi więcej realistyczny punkt widzenia: enter image description here

2

Miałem ten problem, a rozwiązanie było dość proste. Jak wspomniano wcześniej, SyncAdapter działa na innym wątku, więc musisz skierować debugger do tego wątku. Na Android Studio dodawania (kod poniżej) wewnątrz klasy SyncAdapter:

android.os.Debug.waitForDebugger(); 

Podczas debugowania aplikacji usługa adapter synchronizacja nie zostanie automatycznie uruchomiony, więc trzeba go uruchomić, a następnie kierować że proces.

Dołączanie debugera do Android Procesu (to ikona obok zielonego bug)

To powinno działać dobrze

+0

Dziękuję bardzo! – murrayc

0
android:process=":sync" 

Jak podano w innych odpowiedzi działa świetnie.

Jeśli twoje połączenie z ContentResolver.requestSync (mAccount, AUTHORITY, settingsBundle) ma z tym coś nie w porządku, twoja usługa nie zostanie wywołana bez zgłaszanych błędów. Należy dwukrotnie sprawdzić, czy łańcuch Authority pasuje do pliku manifestu i xml oraz do kodu java.Także przedmiotem konto jest prawidłowo utworzony z prawej typ konta i dodawane do AccountManager używając:

accountManager.addAccountExplicitly(newAccount, null, null) 

(nazwy zmiennych są nazywane po oficjalnym android samouczek here.