1

SyncAdapter を使用して、データをサーバーと同期します。すべてが機能しますが、エクストラを に送信するのに苦労していSyncAdapterます。

ContentObserverの場合、次のコードを使用してリクエストを SyncAdapter に送信します。

    @Override
public void onChange(boolean selfChange, Uri changeUri) {

    Bundle extras = new Bundle();
    extras.putParcelable(Globals.EXTRA_URI, changeUri);
    extras.putInt("no", 123456);
    extras.putBoolean(
            ContentResolver.SYNC_EXTRAS_MANUAL, true);
    extras.putBoolean(
            ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
    ContentResolver.requestSync(account, MyProvider.AUTHORITY, extras);

}

ただし、SyncAdapter一方で、これらの追加機能は取得できません。

@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {

    Uri changeUri = extras.getParcelable(Globals.EXTRA_URI);
    int aaa = extras.getInt("no");

    Log.i(TAG, "Syncadapter / uri: "+changeUri+"/"+aaa+"/"+extras.size());

//Logcat: Syncadapter / uri: null/0/1

...
}

エクストラを使用して、どのデータを同期する必要があるかを調べたいと思います。また、システムは ContentResolver 固有のエクストラを無視します。たとえば、ContentResolver.SYNC_EXTRAS_MANUAL (同期はすぐには実行されません)。


編集: ContentObserver.onChange() によって呼び出された場合にのみ、これらの余分なパラメーターが失われていることに気付きました。requestSync()アクティビティ内で呼び出すと、すべてが期待どおりに機能します。

4

1 に答える 1

2

その背後にある本当の理由はわかりませんが、なんとか機能させることができました。

問題は、URI をパーセル可能なエクストラとして送信しようとしていたことです。ContentObserver 経由で送信すると、SyncAdapter への送信に黙って失敗しました。しかし、アクティビティから同じ呼び出しを試みたところ、何らかの例外が発生しました (それが何であったかは覚えていません)。

解決策は、この余分なものを取り除き、代わりに定数整数を送信することでした。

于 2013-07-27T09:00:41.253 に答える