无法执行同步(未调用onPerformSync)

时间:2012-10-30 04:57:12

标签: android android-service

我按照此标题Why does ContentResolver.requestSync not trigger a sync?,但同步方法未出现在设置屏幕中的帐户和同步中。我认为没有调用 onPerformSync()。我尝试调试但没有找到错误日志。这是我的代码:

syncAdapter.xml

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="@string/ACCOUNT_TYPE"
android:contentAuthority="@string/AUTHORITY"
android:userVisible="true"
android:isAlwaysSyncable="true"

/&GT;

SyncService.java

public class CalendarSyncService extends Service{
private static SyncAdapterImpl sSyncAdapter = null;
private static String list_event_ids;
private static Requestor requestor;

public void onCreate(){
    super.onCreate ();
    if (sSyncAdapter == null)
        sSyncAdapter = new SyncAdapterImpl(this);
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return sSyncAdapter.getSyncAdapterBinder();
}

public class SyncAdapterImpl extends AbstractThreadedSyncAdapter {

    Context context;
    public SyncAdapterImpl(Context context) {
        super(context, true);
        // TODO Auto-generated constructor stub
        this.context = context;
    }

    @Override
    public void onPerformSync(Account arg0, Bundle arg1, String arg2,
            ContentProviderClient arg3, SyncResult arg4) {
        // TODO Auto-generated method stub
        Log.e("thuutai", "Perform Sync Call");

        try {
            CalendarSyncService.performSync(context);
        } catch (DOMException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

我在这里打电话

public void onClick(View arg0) {
Bundle params = new Bundle();
        params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
        params.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
        params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
        ContentResolver.addPeriodicSync(selectedAccount, getString(R.string.AUTHORITY), params, 3600);
        ContentResolver.setSyncAutomatically(selectedAccount, getString(R.string.AUTHORITY), true);

        ContentResolver.requestSync(selectedAccount, getString(R.string.AUTHORITY), params);}

的Manifest.xml

 <service android:name=".service.CalendarSyncService" android:exported="true">
        <intent-filter>
            <action android:name="android.content.SyncAdapter" />
        </intent-filter>
        <meta-data android:name="android.content.SyncAdapter"
         android:resource="@xml/syncadapter" />
    </service>

我在Nexus S Android 4.0中测试过。 感谢您的阅读!

3 个答案:

答案 0 :(得分:8)

由于正在进行类似的同步,有时不会调用此方法。您可以使用以下代码进行检查并取消:

if (ContentResolver.isSyncPending(yourAccount, yourAuthority)  ||
    ContentResolver.isSyncActive(yourAccount, yourAuthority)) {
  Log.i("ContentResolver", "SyncPending, canceling");
  ContentResolver.cancelSync(yourAccount, yourAuthority);
}

答案 1 :(得分:1)

您可以尝试的是:

ContentResolver.setSyncAutomatically(account, AUTHORITY, true);

我尝试设置isAlwaysSyncable标记,但它对我不起作用(尽管这可能是另一个问题)。

答案 2 :(得分:-1)

您必须强制手动同步。

Bundle params = new Bundle();
params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(selectedAccount, getString(R.string.AUTHORITY), params);