Синхронизируйте базу данных Android с помощью AbstractThreadedSyncAdapter: onPerformSync не вызывается

Я пытаюсь синхронизировать свою локальную базу данных с моим сервером, используя AbstractThreadedSyncAdapter. Я следовал руководству, которое нашел, но не могу заставить его работать. Это для андроид 2.2.

У меня работает система Authenticator. В моей AccountAuthenticatorActivity после создания учетной записи я делаю:

Bundle params = new Bundle();
params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
params.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
ContentResolver.addPeriodicSync(account, "com.syncal.authority", params, 30);
ContentResolver.setSyncAutomatically(account, "com.syncal.authority", true);
ContentResolver.requestSync(account,"com.syncal.authority",params);

Я создал свой SyncService и объявляю его в своем манифесте. Некоторые из функций:

@Override
public IBinder onBind(Intent intent) {
    Log.i(TAG, "inBind() " + intent.getAction());
    return getSyncAdapter().getSyncAdapterBinder();
}

private synchronized AbstractThreadedSyncAdapter getSyncAdapter() {
    Log.i(TAG, "getSyncAdapter()");
    if (mSyncAdapter == null) {
         mSyncAdapter = new SweetSyncAdapter(this, true);
    }
    return mSyncAdapter;
}

А потом я реализовал свой SyncAdapter. Функция onPerformSync пуста, я просто хочу знать, вызывается она или нет, и она НИКОГДА не вызывается.

public class SweetSyncAdapter extends AbstractThreadedSyncAdapter {

    Context mContext;
    private String AUTH_TOKEN_TYPE;
    private AccountManager mAccountManager;
    private String mAuthToken;
    private final String TAG = "SweetContactSync";
    static final String LAST_SYNC_KEY = "lastSync";

    public SweetSyncAdapter(Context context, boolean autoInitialize) {
        super(context, autoInitialize);
        Log.i(TAG, "SweetSyncAdapter");
        mContext = context;
        AUTH_TOKEN_TYPE = mContext.getString(R.string.account_type);
        mAccountManager = AccountManager.get(mContext);
    }

    public interface ISugarRunnable {
         public void run() throws URISyntaxException, OperationCanceledException, AuthenticatorException, IOException,
            AuthenticationException;
    }

    class SugarRunnable implements Runnable {
        ISugarRunnable r;
        Account mAccount;
        SyncResult mSyncResult;

        public SugarRunnable(Account acc, SyncResult syncResult, ISugarRunnable _r) {
            r = _r;
            mAccount = acc;
            mSyncResult = syncResult;
        }

        public void run() {
            try {
                r.run();
    } catch ... //All the catchs
        }
    }

    @Override
    public void onPerformSync(final Account account, Bundle extras, String authority,
                ContentProviderClient provider, SyncResult syncResult) {
        Log.i(TAG, "onPerformSync()");
    }
}

Мой xml/sync_adapter.xml имеет следующий код:

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="com.syncal.authority"
    android:accountType="com.syncal.account"   
/>

Вот служебная часть манифеста:

<service android:name=".sweet.SweetSyncService" android:exported="true"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.content.SyncAdapter" />
    </intent-filter>

    <meta-data android:name="android.content.SyncAdapter"
        android:resource="@xml/sync_adapter" />

</service>

Я даже создал свой ContentProvider (функции пустые, просто пишут в лог), потому что в гайде, которому я следовал, сказано, что он нужен и я его тоже объявил в манифесте, но ни одна из функций не вызывается.

Кто-нибудь знает, почему моя функция onPerformSync не вызывается? Вызывается функция onBind моего SweetSyncService, и она создает мой SweetSyncAdapter, но мой журнал не показывает никаких сообщений с этого момента.

Спасибо за внимание, я знаю, что набрал много кода, но я уже некоторое время работаю над этим и не могу его исправить.


person PX Developer    schedule 19.06.2012    source источник
comment
не могли бы вы дать ссылку на это руководство? :)   -  person Kenny D.    schedule 08.05.2013
comment
Почему вы сохраняете контекст (возможна утечка памяти!), в то время как ваш суперкласс делает это за вас developer.android.com/reference/android/content/ (все еще возможна утечка памяти!)?   -  person Marian Paździoch    schedule 20.04.2016


Ответы (1)


Наконец-то мне удалось найти ошибку. Я добавил некоторые разрешения в свой манифест, и теперь он работает:

<uses-permission android:name="android.permission.READ_SYNC_STATS" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
person PX Developer    schedule 20.06.2012