2016-07-01 22 views
2

Lösung: Ich habe vergessen, meine SyncAdapterBinder in meinem Dienst in der Methode onBind zurückzugeben.Android SyncAdapter wird instanziiert, aber onPerformSync nie aufgerufen

Vielen Dank Selvin für Ihre Hilfe!

Ich versuche, dieses Problem für zwei Tage zu lösen und habe grundsätzlich jedes verwandte Thema gelesen, konnte aber bisher keine Lösung finden. Ich habe einen Android SyncAdapter geschrieben und ich denke alles was ich geschrieben habe ist korrekt. Das Problem ist, dass mein Code in der Methode onPerformSync nie aufgerufen wird. In den Kontoeinstellungen meines Telefons wird der SyncAdapter angezeigt und ich kann ihn auslösen, aber nichts passiert. Es sagt mir, dass es für eine Weile synchronisiert und dann stoppt. Ich habe eine funktionierende AccountAuthenticator und ich schließe meine Behörde mit meinem Konto mit:

ContentResolver.setIsSyncable(account, "de.mydomain.myapp.provider",1); ContentResolver.setSyncAutomatically(account,"de.mydomain.myapp.provider",true); 

Hier einige meiner Codesnippets sind:

DatabaseSyncAdapter.java

public class DatabaseSyncAdapter extends AbstractThreadedSyncAdapter { 
private final AccountManager am; 
private static final String TAG = "DatabaseSyncAdapter"; 

public DatabaseSyncAdapter(Context context, boolean autoInitialize) { 
super(context, autoInitialize); 
am = AccountManager.get(context); 
Log.d(TAG, "DatabaseSyncAdapter() called with: " + "context = [" + context + "], autoInitialize = [" + autoInitialize + "]"); 

} 

public DatabaseSyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSync) { 
    super(context, autoInitialize, allowParallelSync); 
    am = AccountManager.get(context); 

} 

@Override 
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { 
    Log.d(TAG, "onPerformSync() called with: " + "account = [" + account + "], extras = [" + extras + "], authority = [" + authority + "], provider = [" + provider + "], syncResult = [" + syncResult + "]"); 
    //doing sync stuff 
} 

syncadapter.xml

<?xml version="1.0" encoding="utf-8"?> 
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" 
android:contentAuthority="de.mydomain.myapp.provider" 
android:accountType="de.mydomain.myapp.user" 
android:userVisible="true" 
android:allowParallelSyncs="false" 
android:isAlwaysSyncable="true" 
android:supportsUploading="true"/> 

SyncService.java

public class SyncService extends Service{ 


    private static final Object sSyncAdapterLock = new Object(); 

    private static DatabaseSyncAdapter sSyncAdapter = null; 


    @Override 

    public void onCreate() { 

    synchronized (sSyncAdapterLock) { 

    if (sSyncAdapter == null) 

    sSyncAdapter = new DatabaseSyncAdapter(getApplicationContext(), true); 

    } 

    } 

    @Override 

    public IBinder onBind(Intent intent) { 
     return null; 
    } 

} 

Einträge in Manifest:

<service 
    android:name="de.mydomain.myapp.util.SyncService" 
    android:exported="true"   > 
    <intent-filter> 
     <action android:name="android.content.SyncAdapter" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.content.SyncAdapter" 
     android:resource="@xml/syncadapter" /> 
</service> 

<provider 
    android:name="de.mydomain.myapp.util.StubProvider" 
    android:label="SyncLabel" 
    android:authorities="de.mydomain.myapp.provider" 
    android:exported="false" 
    android:syncable="true" /> 

Ich habe auch eine StubProvider Klasse, aber es ist nur das StubProvider Beispiel von Google. All dies ist Standard-Code, aber wenn ich ContentResolver.requestSync (...) aufrufen, passiert nichts. Ich bekomme nicht einmal einen Fehler und ich weiß, dass ich meinen Logcat-Filter ändern muss, um alle Logs zu sehen. Ich kann das Protokoll sehen, wenn der DatabaseSyncAdapter instanziiert wird. Ich habe Konstanten verwendet, um sicherzustellen, dass meine Autorität und mein Kontotyp immer gleich sind und requestSync mit den richtigen Argumenten aufgerufen wird.

Vielen Dank für Ihre Hilfe, ich habe keine Ahnung, wo mein Problem sein könnte:/

+0

Sie haben vergessen, binder 'public IBinder onBind (Intent intent) zurückzugeben { return sSyncAdapter.getSyncAdapterBinder(); } 'Android OS versucht, Ihren' SyncService' zu ​​binden, aber es wird null, kann also 'onPerformSync' nicht aufrufen – Selvin

+0

Das war das Problem. Ich danke dir sehr! Ich fühle mich wie ein Idiot, weil ich diesen Fehler nicht gesehen habe:/Sie sparen mein Wochenende! – Tmesus

Antwort

0

Es ist ein sehr ähnliches Problem für mich war. Für alle anderen mit diesem Problem:

if(intent.getAction().equals(Intent.ACTION_SYNC)) { //Do not do this!!!! 
    // Return the communication channel to the service. 
    return sSyncAdapter.getSyncAdapterBinder(); 
} else { 
    return null; 
} 

Die Absicht geliefert hat nicht die Wirkung habe ich für überprüft. Es war android.content.SyncAdapter stattdessen. Das Entfernen der if-Klausel löste das Problem.