关于AsyncTask中Java泛型的问题

时间:2011-06-05 08:12:11

标签: java android generics

Android documentation有一个使用AsyncTask的例子,在这个例子中,DownloadFilesTask类以一种相当奇怪的方式扩展AsyncTask(至少对于初学者的观点):

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {

AsyncTask不应该接受类型变量而不是原始类型吗?如果我想在所有3个参数中输入字符串会发生什么?像这样:

private class DownloadFilesTask extends AsyncTask<String, String, String> {

该类如何单独引用这些参数?

4 个答案:

答案 0 :(得分:3)

这些通用类型仅定义了<Param, Progress, Result>所具有的输入类型,这意味着execute()的所有参数都属于Param类型,onProgressUpdate的所有参数类型都属于Progress doInBackground() Result将返回class X extends AsyncTask<...>类型的内容。泛型只定义了以后要求的东西的类型

如果您有一个不错的IDE,当您定义execute()时,它将为您提供填写所有正确类型的回调。

在你的第二个例子中 - 这并不意味着Param期望3个字符串 - 实际上它需要一个或多个{{1}}类型的变量,因为它是一个varargs签名。在该方法中,您将引用单个实例,如访问数组。

答案 1 :(得分:1)

如果查看链接到的页面,则类型参数实际上名为ParamsProgressResult。这就是类引用这些类型参数的方式。在他们的例子中,然后:

  • Params绑定到URL
  • 类型
  • Progress绑定到Integer
  • 类型
  • Result绑定到Long
  • 类型

请参阅有关每种类型的用途的文档。

答案 2 :(得分:0)

Android文档解释了AsyncTask类有3个参数: android.os.AsyncTask<Params, Progress, Result>

因此,first class参数定义传递给AsyncTask的参数类型。显然这取决于你的任务。给出URL作为示例,但您可以使用任何类或原始包装器。

第二个类参数可帮助您定义在任务执行期间如何获取状态更新。使用Integer意味着该示例可以估计任务完成的百分比。您可以使用String代替将用于定义任务阶段(例如,启动,连接,解析,分析,关闭......)

结果定义了您的任务返回的内容。你可以在这里使用任何类型。

顺便说一下,我建议你阅读一些关于java泛型的内容。它可以帮助您学习其他API。

答案 3 :(得分:0)

由于java自动装箱功能,它接受原始类型:Integer和int是可互换的 - 如果代码需要int,则java将使用Integer.getInt();如果需要Integer等,则使用new Integer(int)。这适用于所有原始类型及其相应的类(long vs Long,float vs Float等)