получить уведомление о завершении функции requestSync - PullRequest
0 голосов
/ 24 февраля 2012

я пытаюсь запустить календарную синхронизацию программно с помощью этого кода

Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_FORCE, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);

ContentResolver.requestSync(accounts[0], "com.android.calendar", bundle);

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

while (ContentResolver.isSyncActive(accounts[0], "com.android.calendar")) {
System.out.println("looping: " + i);
}

readLocalCalendar();
readLocalEvents();

но система выходит из цикла до окончания синхронизации, и я все еще могу видеть знак синхронизации в строке состояния, поэтому любая помощь, чтобы я мог прочитать события календаря после завершения синхронизации ??

спасибо

Ответы [ 4 ]

10 голосов
/ 28 января 2013

Другой вариант - зарегистрировать широковещательный приемник, чтобы сообщать вам, когда синхронизация завершена, следующим образом:

public class UpdateableActivity extends Activity {
    public static final String ACTION_FINISHED_SYNC = "your.package.ACTION_FINISHED_SYNC";

    private static IntentFilter syncIntentFilter = new IntentFilter(ACTION_FINISHED_SYNC);

    private BroadcastReceiver syncBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // update your views
        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        // register for sync
        registerReceiver(syncBroadcastReceiver, syncIntentFilter);
        // do your resuming magic
    }

    @Override
    protected void onPause() {
        unregisterReceiver(syncBroadcastReceiver);
        super.onPause();
    }
}

Внутри SyncAdapter используйте, когда закончите:

getContext().sendBroadcast(new Intent(UpdateableActivity.ACTION_FINISHED_SYNC));  

Вы также можете использовать это для запуска или обновления статуса синхронизации;)

Обновление: Обновлен код, чтобы избежать утечек и убедиться, что активность все еще активна (onResume / onPause)

1 голос
/ 29 июля 2012

с использованием addStatusChangeListener на самом деле работает для меня.

вот ссылка.

не забудьте добавить необходимые разрешения.

0 голосов
/ 24 февраля 2012

Используйте ContentResolver.addStatusChangeListener (int mask, SyncStatusObserver callback), чтобы получать уведомления об изменениях в статусе синхронизации. документы

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

Вы также можете использовать ContentResolver.registerContentObserver (Uri uri, boolean notifyForDescendents, ContentObserver observer) документы , чтобы получать уведомления об изменениях определенного URI (например, URI календаря)

0 голосов
/ 24 февраля 2012

попробуйте AsyncTask:

private class CustomTask extends AsyncTask<Void, Void, Void>{

      @Override
      protected Void doInBackground(Void... params) {
       // TODO sync your calendar
      }

      protected void onProgressUpdate(Void... progress) {
        //TODO display a spinner or something else to show progress
      }

      protected void onPostExecute(Void t){
       //TODO what you want when doInBackground has finished

      }

}

Удачи!

...