2015-08-18 41 views
6

Quello che voglio è passare una variabile int al mio AsyncTask.Come posso passare un int primitivo al mio AsyncTask?

int position = 5; 

E ho dichiarato il mio AsyncTask in questo modo:

class proveAsync extends AsyncTask<int, Integer, Void> { 

    protected void onPreExecute(){ 
    } 

    protected Void doInBackground(int... position) { 
    } 

    . 
    . 
    . 

Ma ho avuto un errore che è il seguente:

Tipo argomento non può essere di tipo primitivo

Ho appena potuto passare un int[] e Integer va VARIABILI ma mai una variabile int ed eseguo il mio AsyncTask in questo modo:

new proveAsync().execute(position); 

C'è qualcosa che potrei fare per passare solo questo position?

Grazie in anticipo!

risposta

14

Far passare il parametro come Integer

class proveAsync extends AsyncTask<Integer, Integer, Void> { 

    protected void onPreExecute(){ 
    } 

    protected Void doInBackground(Integer... position) { 
     int post = position[0].intValue(); 
    } 

    . 
    . 
    . 

durante l'esecuzione di fare questo

new proveAsync().execute(new Integer(position)); 

è possibile ottenere il valore int in AsyncTask esempio utilizzando intValue()

+1

Perché si deve fare riferimento alla posizione come se è un array? 'position [0]' –

+1

perché '...' significa che può prendere qualsiasi numero di parametri e vengono passati come una matrice. Se passi solo un parametro ottieni il primo valore. – Rohit5k2

+2

Perché '...' indica che si tratta di un array. Significa che la funzione di chiamata (in questo caso, il filtraggio verso il basso per l'esecuzione (...)) può avere uno o più numeri interi assegnati. Si potrebbe avere '.execute (1);' o '.execute (1, 2, 3)' o '.execute (intArray)' – Knossos

4

Usatelo come questo.

class proveAsync extends AsyncTask<Integer, Void, Void> { 

    protected void onPreExecute(){ 
    } 

    protected Void doInBackground(Integer... params) { 
     int position = params[0]; 
    ... 

Posizione di passaggio in un array. ad esempio:

Integer[] asyncArray = new Integer[1]; 
asyncArray[0] = position; 
new proveAsync().execute(asyncArray); 
+0

Grazie per aver aiutato a mostrare questo processo in una prospettiva diversa. – JamisonMan111

3

È anche possibile utilizzare il costruttore di AsyncTask.

class proveAsync extends AsyncTask<Void, Void, Void> { 
int position; 
    public proveAsync(int pos){ 
     position = pos; 
    } 

    protected void onPreExecute(){ 
    } 

    protected Void doInBackground(Void... args) { 
    } 

    . 
    . 

poi utilizzarlo come:

new proveAsync(position).execute(); 

e si può passare nulla al requisito senza cambiare tipo di ritorno e gli argomenti in questo modo ..

+0

Che cos'è più efficiente? Per passarlo con un costruttore o passare come parametro? –

+2

La funzione prevista di AsyncTask viene ignorata quando viene eseguita in questo modo. Sebbene la funzione del codice venga eseguita come vuoi tu, sembra sporca. Secondo me almeno. – Knossos

+0

Grazie per la spiegazione @Knossos! –

Problemi correlati