OnPerformSync () called multiple times

My application has a sync adapter created by the structure presented by the Android developers site . The onPerformSync() method onPerformSync() data from the Internet and inserts it into the database with bulk insert:

 Vector<ContentValues> cVVector = new Vector<ContentValues>(rssItems.size()); for(RssItem rssItem : rssItems) { ContentValues newsValues = new ContentValues(); // Get data from the remote server // Fill all the values newsValues.put(...); // Add the values to a vector, at the end a BulkInsert will be called cVVector.add(newsValues); } mContext.getContentResolver().bulkInsert(NewsEntry.CONTENT_URI, cvArray); 

In case of conflicts, the database has an IGNORE policy:

 final String SQL_CREATE_NEWS_TABLE = "CREATE TABLE " + NewsEntry.TABLE_NAME + " (" + NewsEntry._ID + " INTEGER PRIMARY KEY," + NewsEntry.COLUMN_NEWS_TITTLE + " TEXT UNIQUE NOT NULL, " + NewsEntry.COLUMN_NEWS_CONTENT + " TEXT NOT NULL, " + NewsEntry.COLUMN_NEWS_DESCRIPTION + " TEXT NOT NULL, " + NewsEntry.COLUMN_NEWS_IMAGE + " TEXT, " + NewsEntry.COLUMN_NEWS_DATE + " TEXT NOT NULL, " + NewsEntry.COLUMN_NEWS_LINK + " TEXT NOT NULL, " + "UNIQUE (" + NewsEntry.COLUMN_NEWS_TITTLE +") ON CONFLICT IGNORE"+ " );"; 

And the sync adapter is configured to sync every 86400 seconds

 /** * Helper method to schedule the sync adapter periodic execution */ public static void configurePeriodicSync(Context context, int syncInterval, int flexTime) { Account account = getSyncAccount(context); String authority = context.getString(R.string.content_authority); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // we can enable inexact timers in our periodic sync SyncRequest request = new SyncRequest.Builder(). syncPeriodic(syncInterval, flexTime). setSyncAdapter(account, authority).build(); ContentResolver.requestSync(request); } else { ContentResolver.addPeriodicSync(account, authority, new Bundle(), syncInterval); } } 

However, it is called continuously.

+5
source share
2 answers

onPerformSync () will be called only if it is forcibly called using the "requestSync" api and once during the creation of an account with an empty package.

0
source

I was stuck with the same problem, and eventually found that I also called ContentResolver.requestSync() several times (before each onPerformSync() ). In other words, requestSync() calls the onPerformSync() call. That was my mistake, and I have to rethink the logic.

Try writing requestSync() calls to your code and you can probably find the error.

0
source

Source: https://habr.com/ru/post/1203084/


All Articles