2016-05-22 8 views
0

Я пытаюсь заставить мое приложение выполнять синхронизацию каждую секунду или только каждые 4 или 5 секунд. Однако минимальный период я ​​могу сделать синхронизацию синхронизации 30-60 секунд. Как можно архивировать такое поведение?SyncAdapter - Периодическая синхронизация каждую секунду

Независимо от того, что я установил i вторым параметром в addPeriodicSync(), он не будет ниже 30 секунд. ContentResolver.setMasterSyncAutomatically (true); ContentResolver.setIsSyncable (mAccount, AUTHORITY, 1);

ContentResolver.setSyncAutomatically(mAccount, AUTHORITY, true); 
    ContentResolver.addPeriodicSync(
      mAccount, 
      AUTHORITY, 
      Bundle.EMPTY, 
      4); 

Я знаю, что это плохое поведение для приложения, как он будет стекать батарею, и что GCM должна была использоваться для создания толчков с сервера. Приложение предназначено для презентации университетского проекта, поэтому мне нужно быть отзывчивым и презентабельным.

Edit:

Я знаю о возможности ручной синхронизации :):

Спасибо заранее.

+0

Если вам нужна такая отзывчивость, почему бы не использовать Firebase? – EpicPandaForce

+0

Firebase is GCM https://developers.google.com/cloud-messaging/android/android-migrate-fcm Я уже упоминал в своем вопросе. – user1868569

+0

Система базы данных. – EpicPandaForce

ответ

0

Я бы предположил, что SyncAdapter нельзя использовать таким образом, поскольку он специально разработан, чтобы не работать таким образом.

Если вам требуется приложение для выполнения синхронизации каждую секунду, возможно, вам следует просто внедрить IntentService, который перезагружается с задержкой намерения (где вы можете установить задержку на 1 секунду) и выполнить синхронизацию там, а не в SyncAdapter.

EDIT: Вот пример реализации, пожалуйста, на самом деле не используйте это ни для чего, кроме демонстрации, хотя я чувствую себя немного грязным для его написания.

public class ContinuousSyncService extends IntentService { 

    private static final int DELAY = 1000; // ms 

    public ContinuousSyncService() { 
     super(ContinuousSyncService.class.getName()); 
    } 

    public static PendingIntent getPendingIntent(@NonNull Context context) { 
     Intent intent = new Intent(context, ContinuousSyncService.class); 
     return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    } 

    private void scheduleNextStart(long delay) { 
     ((AlarmManager) getSystemService(Context.ALARM_SERVICE)).set(
       AlarmManager.ELAPSED_REALTIME, 
       SystemClock.elapsedRealtime() + delay, 
       getPendingIntent(this)); 
    } 

    @Override 
    protected void onHandleIntent(final Intent intent) { 
     sync(); 
     scheduleNextStart(DELAY); 
    } 

    private void sync() { 
     // Either use ContentResolver.requestSync() 
     // Or just put the code from your SyncAdapter.onPerformSync() here 
    } 

} 
+0

Не могли бы вы привести пример из архива? :) – user1868569

+0

@ user1868569 Добавлена ​​реализация образца. – Thorbear

0

Вы не можете запланировать синхронизацию с интервалом менее 60 секунд.

Вы можете подтвердить это путем считывания кода, или просмотрев этот SO answer

0

Я сделал это так:

Добавить разрешение <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> в файле манифеста.

Добавить ниже метода для синхронизации:

public void syncAllAccountsPeriodically(Context contextAct, long seconds) throws Exception { 
    AccountManager manager = AccountManager.get(contextAct); 
    Account[] accounts = manager.getAccountsByType("com.google"); 
    String accountName = ""; 
    String accountType = ""; 
    for (Account account : accounts) { 
     accountName = account.name; 
     accountType = account.type; 
     break; 
    } 

    Account a = new Account(accountName, accountType); 
    ContentResolver.addPeriodicSync(a, AUTHORITY, 
     Bundle.EMPTY, seconds*1000); 
} 

Надеется, что это должно помочь вам.