【发布时间】:2013-02-20 14:32:47
【问题描述】:
Google 使用varargs 作为AsyncTask 中的参数的原因是什么?例如execute()、doInBackground() 和publishProgress() 方法都使用[Type]... 表示法。
我认为这使得它“更难”使用,所以他们一定有一些我忽略的充分理由?
所以,要么我们没有参数,要么有一个参数,要么有多个参数。让我们分解一下:
无参数(简单):
Params参数为Void,仅此而已。 (这些方法不能使用它......所以这很安全。)-
一个参数:在这里,我至少觉得有必要在
doInBackground()方法的开头做个检查。例如,这是一个接收Integer并产生Double类型结果的任务:public Double doInBackground(Integer... myParameters) { // we are only expecting one parameter if (myParameters.length != 1) throw new IllegalArgumentException("!= 1"); return 100d * myParameters[0]; } 多个参数。现在这里一定是谷歌做出正确选择的地方吗?但正如我所见,您要么对相同类型的参数列表感兴趣,要么想要不同类型的参数。 Google 只解决了其中一种情况(对于不同的类型,您需要某种通用接口。在许多情况下,我最终会得到
Object...,这并不是真正的类型安全...)
那么,如果我们完全删除 varargs 会有什么问题?以下是方法的子集:
class AsyncTask<Param, Progress, Result> {
abstract Result doInBackground(Param param);
void publishProgress(Progress progress) { ... }
}
这适用于上述所有情况。例如,如果我们想处理一个参数数组,我们可以只使用数组类型param:
class MyAsyncTask extends AsyncTask<String[], Integer, String> {
String doInBackground(String[] param) {
return Arrays.toString(param);
}
}
我看不出它什么时候会有实际用途。但我确定我错过了一些我需要知道的东西。 :)
【问题讨论】:
-
为什么这个问题与那个问题重复?这是我正在质疑的特定界面。开发人员为什么要使用可变参数来解决这个特定问题。我想我已经明确表示我知道它是什么,并且我会在适当的时候使用它.. :)
-
“这是一个我在质疑的特定接口”——你的论点中没有任何与
AsyncTask有任何特定关系的东西。您可能会抱怨在Restaurant类中使用可变参数。如果您的问题集中在可变参数对AsyncTask如何处理线程之间的通信的影响上,那么它可能不是重复的。但是,就目前而言,恕我直言,我引用的问题中提出的答案似乎也涵盖了这个问题。 -
此外,“Google 使用可变参数作为参数的原因”是无法回答的,除非我们能说服 Romain Guy(
AsyncTask的原作者)加入这个问题。对于为什么在这种情况下使用可变参数的答案,最接近的答案是通常会使用可变参数的答案,这在链接到的问题中有所介绍。
标签: java android android-asynctask