Es ist (genau genommen) NICHT möglich, mehrere Grundelemente an AsyncTask zu übergeben. Wenn Sie beispielsweise die entsprechende Methode ausführen myTask.execute(long1, long2)
und versuchen möchten, sie einzurichten private class myTask extends AsyncTask<long, Void, Void>
:
@Override
protected LocationItemizedOverlay doInBackground(long... params) {...}
Ihre IDE wird sich wahrscheinlich darüber beschweren, dass eine Supertyp-Methode überschrieben werden muss. Beachten Sie, dass Sie das so genannte verwenden varargs Methodensignatur für doInBackground
, wo (long... params)
wie wenn man sagt : „Ich eine variable Anzahl von Long - Positionen akzeptieren ist, gespeichert als ein Array mit Namen params. Ich verstehe nicht ganz , was bewirkt , dass ein Compiler / IDE Beschwerde angehoben werden , aber ich denke, es hat damit zu tun, wie die generische Klasse Params
definiert ist.
In jedem Fall ist es möglich, problemlos das zu erreichen, was Sie wollen, vorausgesetzt, Sie wandeln Ihre Grundelemente korrekt in ihre jeweiligen nicht-primitiven Wrapper um (z. B. int => Integer, long => Long usw.). Tatsächlich müssen Sie Ihre Grundelemente nicht explizit in Nicht-Grundelemente umwandeln. Java scheint das für Sie zu erledigen. Sie müssen Ihre ASyncTask nur wie folgt einrichten (zum Beispiel für 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]
}
...
}
Sie können diese Klasse dann wie ursprünglich beabsichtigt verwenden, z.
MyTask myTask = new MyTask();
myTask.execute(long1, long2);
Oder für eine beliebige Anzahl von Grundelementen, die Sie möchten, vorausgesetzt, sie sind vom gleichen Typ. Wenn Sie mehrere Arten von Grundelementen übergeben müssen, ist dies ebenfalls möglich. Sie müssen jedoch Folgendes ändern:
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];
}
...
}
Dies ist flexibler, erfordert jedoch das explizite Umwandeln der Parameter in ihre jeweiligen Typen. Wenn diese Flexibilität nicht benötigt wird (dh ein einzelner Datentyp), empfehle ich, bei der ersten Option zu bleiben, da diese etwas besser lesbar ist.