5

Sto creando un'applicazione con un syncAdapter.Inserire più parametri in ContentResolver.requestSync

Desidero essere in grado di eseguire una richiesta di sincronizzazione insieme ad alcuni parametri che verranno inviati tramite il relativo pacchetto. il motivo è che desidero scegliere cosa farebbe l'istanza di syncAdapter.

per qualche ragione, sia putSerializable e putIntArray fa sì che il ContentResolver per generare un'eccezione:

08-16 14:34:49.080: E/AndroidRuntime(10318): java.lang.IllegalArgumentException: unexpected value type: java.util.MiniEnumSet 
08-16 14:34:49.080: E/AndroidRuntime(10318): at android.content.ContentResolver.validateSyncExtrasBundle(ContentResolver.java:1144) 
08-16 14:34:49.080: E/AndroidRuntime(10318): at android.content.ContentResolver.requestSync(ContentResolver.java:1111) 
08-16 14:34:49.080: E/AndroidRuntime(10318): at com.sciatis.syncer.syncing.SyncAdapter.requestSync(SyncAdapter.java:100) 
08-16 14:34:49.080: E/AndroidRuntime(10318): at 
... 

Perché succede? c'è un modo per superare questo? mettere un intero funzionava bene, ma quelle operazioni no.

sto facendo qualcosa di sbagliato? c'è un modo migliore per ottenere parametri di invio a syncAdapter da un'attività?

+1

da doc: 'solo i valori di possono essere utilizzati negli extra i seguenti tipi di bundle: Integer, Lungo, booleano, Float, doppio, String' ... metti qualcosa tipo 'arrc' con la lunghezza dell'array e poi' arr0' a 'arrn' dove' n' = 'arrc' - 1 – Selvin

+0

puoi per favore inserire il link dei documenti? Inoltre, si prega di mettere la tua risposta in un post in modo che io possa votare per questo, e per favore spiegare di più sul tuo suggerimento ... –

risposta

8

ContentResolver.requestSync dice:

solo i valori di possono essere utilizzati negli extra i seguenti tipi di bundle: Integer lungo booleano Float doppio String

in quel caso si potrebbe prova:

Bundle extras = new Bundle(); 
int[] arr = new int[] {1,2,3,4}; 
extras.putInt("arrlen", arr.length); 
for (int i = 0; i < arr.length; i++) { 
    extras.putInt("arr"+ i, arr[i]); 
} 

e poi leggere quei valori in SyncAdapter:

Bundle extras; //taken from method params 
int[] arr = new int[extras.getInt("arrlen")]; 
for (int i = 0; i < arr.length; i++) { 
    arr[i] = extras.getInt("arr"+ i); 
} 
+0

oh ora capisco. Grazie . nel mio caso, volevo passare un enumSet, quindi finché non hai scritto la soluzione ho usato una stringa separata da ",". penso che la tua soluzione avrebbe funzionato anche per questo, giusto? –

+0

sì, ma anche i tuoi devono essere buoni ... e penso che la tua soluzione consuma meno memoria della mia :) – Selvin

+0

pensi? ok, userò il mio, anche se la tua soluzione è abbastanza buona. –