(严格来说)不可能将多个原语传递给 AsyncTask。比如你想执行myTask.execute(long1, long2),尝试用对应的方法设置private class myTask extends AsyncTask<long, Void, Void>:
@Override
protected LocationItemizedOverlay doInBackground(long... params) {...}
您的 IDE 可能会抱怨需要覆盖超类型方法。请注意,您正在为doInBackground 使用所谓的Varargs 方法签名,其中(long... params) 就像说“我接受可变数量的长整数,存储为一个名为params 的数组。我不完全明白是什么原因导致的提出编译器/IDE 投诉,但我认为这与泛型类 Params 的定义方式有关。
无论如何,只要您正确地将原语转换为它们各自的非原语包装器(例如 int => Integer、long => Long 等),就可以毫无问题地实现您想要的。实际上,您不需要将基元显式转换为非基元。 Java 似乎可以为您处理。您只需要按如下方式设置 ASyncTask(以 long 为例):
private class MyTask extends AsyncTask<Long, Void, Void> {
@Override
protected void doInBackground(Long... params) {
// Do stuff with params, for example:
long myFirstParam = params[0]
}
...
}
然后您就可以按照最初的意图使用此类,例如:
MyTask myTask = new MyTask();
myTask.execute(long1, long2);
或者对于您想要的任意数量的原语,只要它们属于同一类型。如果你需要传递多种类型的原语,也可以这样做,但是你需要将上面的修改为:
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];
}
...
}
这更灵活,但它需要将参数显式转换为它们各自的类型。如果不需要这种灵活性(即单一数据类型),我建议坚持第一个选项,因为它的可读性略高。