AsyncTask varargs参数的用途

dac*_*cwe 14 java android android-asynctask

Google使用varargs参数的原因是什么AsyncTask?例如,方法execute(),doInBackground()以及publishProgress()所有使用[Type]...的符号.

我认为这使得"更难"使用,所以他们必须有一些我忽略的好理由?


所以,要么我们没有参数,要么有一个或多个参数.让我们分解一下:

  1. 没有参数(简单):Params参数是Void,就是这样.(这些方法不能使用它......所以非常安全.)

  2. 一个参数:至少在这里,我觉得有必要在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];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 多个参数.现在这里必须是Google做出正确选择的地方吗?但正如我所看到的那样,您要么对相同类型的参数列表感兴趣,要么需要不同类型的参数.谷歌只解决了其中一种情况(不同类型你需要某种通用界面.在很多情况下,我最终Object...得到的并不是真正的类型安全......)


那么,如果我们完全删除它会有什么问题varargs呢?这是方法的一个子集:

class AsyncTask<Param, Progress, Result> {

    abstract Result doInBackground(Param param);
    void publishProgress(Progress progress) { ... }
}
Run Code Online (Sandbox Code Playgroud)

这适用于上述所有情况.例如,如果我们想要处理一个参数数组,我们可以使用一个数组类型param:

class MyAsyncTask extends AsyncTask<String[], Integer, String> { 

    String doInBackground(String[] param) {
        return Arrays.toString(param);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道什么时候它可以用于任何实际用途.但我确定我错过了一些我需要了解的东西.:)

irr*_*ble 1

我认为你是对的,类型参数的唯一用法Params是 in Params...,这意味着它确实是Params[]这里想要的。然而现在该 API 只适用于数组类型,它错过了很多非数组类型。

可变参数的唯一优点是在调用站点,但也不是很多 -

谷歌版本:

AsyncTask<String> task = ...
task.execute("a", "b");
Run Code Online (Sandbox Code Playgroud)

您的版本:

AsyncTask<List<String>> task = ...
task.execute(Arrays.asList("a", "b"));
Run Code Online (Sandbox Code Playgroud)