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:/
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
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