Il n'est (strictement) PAS possible de passer plusieurs primitives à AsyncTask. Par exemple, si vous voulez exécuter myTask.execute(long1, long2)
et essayer de mettre en place private class myTask extends AsyncTask<long, Void, Void>
avec la méthode correspondante :
@Override
protected LocationItemizedOverlay doInBackground(long... params) {...}
votre IDE se plaindra probablement de la nécessité de surcharger une méthode de type supérieur. Notez que vous utilisez la méthode dite Varargs pour la signature de la méthode doInBackground
donde (long... params)
revient à dire "J'accepte un nombre variable de longs, stockés dans un tableau appelé params. Je ne comprends pas complètement ce qui provoque une plainte du compilateur/IDE, mais je pense que c'est lié à la façon dont la classe générique Params
est définie.
Dans tous les cas, il est possible d'obtenir ce que vous voulez sans problème, à condition de convertir correctement vos primitives en leurs enveloppes non primitives respectives (par exemple, int => Integer, long => Long, etc.). En fait, il n'est pas nécessaire de convertir explicitement les primitives en non primitives. Java semble gérer cela pour vous. Il vous suffit de configurer votre ASyncTask comme suit (pour l'exemple des longs) :
private class MyTask extends AsyncTask<Long, Void, Void> {
@Override
protected void doInBackground(Long... params) {
// Do stuff with params, for example:
long myFirstParam = params[0]
}
...
}
Vous pouvez ensuite utiliser cette classe comme vous l'aviez prévu à l'origine, par exemple :
MyTask myTask = new MyTask();
myTask.execute(long1, long2);
Ou pour n'importe quel nombre de primitives que vous souhaitez, À CONDITION QU'ELLES SOIENT DU MÊME TYPE. Si vous avez besoin de passer plusieurs types de primitives, c'est également possible, mais vous devrez modifier ce qui précède :
private class MyTask extends AsyncTask<Object, Void, Void> {
@Override
protected void doInBackground(Object... params) {
// Do stuff with params, for example:
long myLongParam = (Long) params[0];
int myIntParam = (Integer) params[1];
}
...
}
C'est plus souple, mais cela nécessite de mouler explicitement les paramètres dans leurs types respectifs. Si cette flexibilité n'est pas nécessaire (c'est-à-dire un seul type de données), je recommande de s'en tenir à la première option, car elle est légèrement plus lisible.