How to know when sync is finished?

后端 未结 3 1873
南旧
南旧 2020-12-04 17:46

I have implemented a sync adapter and I want to get a callback when it finishes in my activity. I have tried using ContentResolver.addStatusChangeListener, but I am only get

相关标签:
3条回答
  • 2020-12-04 18:33

    One solution that I have found is to ditch the ContentResolver completely, and implement my own broadcast. Basically, add this in the sync adapter, at the end of onPerformSync:

    Intent i = new Intent(SYNC_FINISHED);
    sendBroadcast(i);
    

    And this in the activity:

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(syncFinishedReceiver, new IntentFilter(DataSyncService.SYNC_FINISHED));
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(syncFinishedReceiver);
    }
    
    private BroadcastReceiver syncFinishedReceiver = new BroadcastReceiver() {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(Const.TAG, "Sync finished, should refresh nao!!");
        }
    };
    

    This seems to work just fine, however I was hoping to find something in the SDK that directly notify me when a sync is finished.

    0 讨论(0)
  • 2020-12-04 18:42

    I was working on something similar, and I have one more Log.d at the end of the onStatusChanged function, and it wasn't executing!

    So after 15 minutes of debugging and trial on error, I realize that I need to add the READ_SYNC_STATS permission, I already have the GET_ACCOUNTS permission though. So, please check that you get the right permission, its not that the "if" doesn't becomes true, its that it bails all the time.

    0 讨论(0)
  • 2020-12-04 18:45

    Strange, it does work for me.

    In my Activity I have:

      @Override
      protected void onPause() {
        super.onPause();
        ContentResolver.removeStatusChangeListener(mContentProviderHandle);
      }
    
      @Override
      protected void onResume() {
        super.onResume();
        mContentProviderHandle = ContentResolver.addStatusChangeListener(
            ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE, this);
      }
    
      @Override
      public void onStatusChanged(int which) {
        AccountManager accountManager = AccountManager.get(this);
        Account[] accounts = accountManager
            .getAccountsByType(AuthenticatorActivity.PARAM_ACCOUNT_TYPE);
    
        if (accounts.length <= 0) {
          return;
        }
    
        updateRefresh(ContentResolver.isSyncActive(accounts[0],
            MyContentProvider.AUTHORITY));
      }
    
      // Since onStatusChanged() is not called from the main thread
      // I need to update the ui in the ui-thread.
      private void updateRefresh(final boolean isSyncing) {
        runOnUiThread(new Runnable() {
    
          @Override
          public void run() {
            if (isSyncing) {
              mRefreshMenu.setActionView(R.layout.menu_item_refresh);
            } else {
              mRefreshMenu.setActionView(null);
            }
          }
        });
      }
    
    0 讨论(0)
提交回复
热议问题