Android SyncAdapter застрял в бесконечном цикле синхронизации - PullRequest
5 голосов
/ 16 августа 2011

Я пишу Android Sync Adapter и, по сути, у меня проблемы с синхронизацией в бесконечном цикле. Как только синхронизация завершится, она начнется снова.

Спасибо,

С уважением,

Акшай

@Override
    public void onPerformSync(final Account account, final Bundle extras, final String authority, final ContentProviderClient provider, final SyncResult syncResult) {
        Log.i("Sync result full sync = " + syncResult.fullSyncRequested);
        Log.i("Sync result " + syncResult.toDebugString());
        Log.i("Bundle " + extras.toString());

        final CountDownLatch latch = new CountDownLatch(3);


        final CachedDataReceiver globalStreamRefreshReciever = new CachedDataReceiver(null) {
            @Override
            protected void onComplete(int resultCode) {latch.countDown();}
            @Override
            protected void onError() {latch.countDown();}
        };

        final CachedDataReceiver newMessagesReciever = new CachedDataReceiver(null) {
            @Override
            protected void onComplete(int resultCode) {latch.countDown();}
            @Override
            protected void onError() {latch.countDown();}
        };

        final CachedDataReceiver getViewedMessagesReciever = new CachedDataReceiver(null) {
            @Override
            protected void onComplete(int resultCode) {latch.countDown();showAnyNewInboxItemAlerts(getApplicationContext());}
            @Override
            protected void onError() {latch.countDown();}
        };


        /*long currentTime = System.currentTimeMillis();
        long netTime = currentTime-getLastSyncTimeStamp();
        boolean shouldSync = (netTime - getSyncInterval()) >=0;
        if (!shouldSync && getSyncInterval()!=Constants.INVALID_ITEM){
            Log.i("Current time = " + currentTime + " last sync = " + getLastSyncTimeStamp() + " sync interval = " + getSyncInterval());
            Log.i("Difference = " + (netTime - getSyncInterval()));
            return;
        }*/



        if (user.isUserLoggedIn() && (!TextUtils.isEmpty(user.peekLoggedInUserAccountToken(null)))){ 
            startService(api.getGlobalStream(0,10,globalStreamRefreshReciever));
            startService(api.getNewMessagesInbox(newMessagesReciever));
            startService(api.getViewedMessagesInbox(false, getViewedMessagesReciever));
            addTimeStamp(); 
            Log.i("in sync");
            try {
                latch.await(1, TimeUnit.MINUTES);
            } catch (InterruptedException interruptedException) {
                interruptedException.printStackTrace();
                Log.e("Error in latch while sync ");
            }

        }
    }

Ответы [ 2 ]

14 голосов
/ 16 ноября 2011

Вам не хватает большого количества кода, трудно найти свою проблему, когда вы не говорите нам, что делаете.

Выйти на конечность с догадкой о ваших проблемах ...

Изменяет ли addTimeStamp() или различные создаваемые вами службы данные, хранящиеся в вашем ContentProvider?

Если это так, ваш ContentProvider вызывает ContentResolver.notifyChange(uri, null)?

Если это так, ваш ContentProvider уведомляет Android о том, что он изменился и нуждается в синхронизации, тем самым управляя циклом.

API - notifyChange (Uri uri, ContentObserver observer, boolean syncToNetwork). вам нужно позвонить с помощью notifyChange(uri, null, false); - это указывает на то, что вы извлекли изменение из сети и что его не следует возвращать в сеть, тем самым нарушая цикл.

0 голосов
/ 08 февраля 2017

когда у нас зарегистрирован ContentObserver, адаптер синхронизации будет зацикливаться, даже если для syncToNetwork задано значение false.

notifyChange(uri, null, false);
...