android - 未在 "Network tickle"上调用 SyncAdapter

标签 android android-syncadapter

概览

我关注了Google's tutorial在不使用 ContentProvider、Authenticator 等的情况下使用 SyncAdapter。当我需要通过 de SyncAdapter 向服务器“上传”时,调用 onPerformSync(...) 时效果很好。

现在,如您所想,我还需要从服务器下载(是的,我知道使用 Google 的 Cloud Messaing 系统会更好,但这是给我的设置,我可以'不要改变它)。为此,我不想定期同步,而是想利用 Android 系统在有可用网络时执行的“网络挠痒痒”。为此,我声明如下:

ContentResolver.setIsSyncable(accounts[0], AUTHORITY, 1);
ContentResolver.setSyncAutomatically(accounts[0], AUTHORITY, true); 

但是我的 SyncAdapter 只是没有被调用。查看其他 stackOverFlow 问题,如果使用 SyncAdapter 定位 API 10 或更低版本似乎存在问题,并且您必须显式添加一个帐户之前调用之前的方法。所以我最终得到了这个:

AccountManager accountManager = (AccountManager) context.getSystemService(ACCOUNT_SERVICE);

    Account[] accounts = accountManager.getAccounts();
    if(accounts.length == 0){ //ADD DUMMY ACCOUNT
        Account newAccount = new Account(ACCOUNT, ACCOUNT_TYPE);
        ContentResolver.setIsSyncable(accounts[0], AUTHORITY, 1);
        ContentResolver.setSyncAutomatically(accounts[0], AUTHORITY, true); 
        accountManager.addAccountExplicitly(newAccount, null, null);
    }else{
         accounts = accountManager.getAccounts();
        ContentResolver.setIsSyncable(accounts[0], AUTHORITY, 1);   
        ContentResolver.setSyncAutomatically(accounts[0], AUTHORITY, true); 
    }

现在这段代码会在用户登录时执行,或者如果应用程序被终止并再次启动。我想知道,是否应该只在第一次添加 dummyAccount 时调用 setIsSyncablesetSyncAutomatically

此外,SyncAdapter 的部分“优点”是它会在出现异常时继续进行调用。但我不太明白这是怎么回事,所以我有这个:

private void profileUpdate(){       
TableAccounts db = TableAccounts.getInstance(getContext());
boolean isRecordDirty = db.isRecordDirty(signedInUser);   

if(isRecordDirty){
   if(server.upDateUserProfile(signedInUser)){
       db.cleanDirtyRecord(signedInUser);
       turnOffPeriodicSync();
   }else{
       this.turnOnPeriodicSync(this.sync_bundle);   
   }
}else
     turnOffPeriodicSync();

}

如您所见,根据我上传到服务器的结果,我打开或关闭了定期同步。

最佳答案

由于 accountManager.getAccounts[] 返回设备上的每个帐户,我认为没有什么能保证 account[0] 是您应用程序的帐户(也就是,具有您的包名称的 ACCOUNT_TYPE)。 -- 您可以在任何情况下调用 addAccountExplicitly(),如果它存在,则什么也不会发生。

    Account account = new Account(ACCOUNT, ACCOUNT_TYPE);

    AccountManager accountManager = (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);
    accountManager.addAccountExplicitly(account, null, null)
    context.getContentResolver().setSyncAutomatically(account, AUTHORITY, true);

关于android - 未在 "Network tickle"上调用 SyncAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22622364/

相关文章:

android 录音机启动无效状态 4

java - 在android中获取短信对话

android - AccountManager.blockingGetAuthToken() 不提示输入凭据

android - 为什么 AccountManager.addAccountExplicitly 会返回 false?

android - 使用 AccountManager addAccountExplicitly 第一次同步需要很长时间

java - 从 Android 应用程序发送 POST

android - 如何保存对 ListView 中的行所做的更改?

android - 基于 WebView 的应用程序的纵向模式问题

android - whatsapp 如何在更新后立即同步联系人

java - 如何通过 Apache 的 HttpClient 在 Couchdb 中设置管理员(给出一个 curl 示例)