Android documentation有一个使用AsyncTask的例子,在这个例子中,DownloadFilesTask类以一种相当奇怪的方式扩展AsyncTask(至少对于初学者的观点):
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
AsyncTask不应该接受类型变量而不是原始类型吗?如果我想在所有3个参数中输入字符串会发生什么?像这样:
private class DownloadFilesTask extends AsyncTask<String, String, String> {
该类如何单独引用这些参数?
答案 0 :(得分:3)
这些通用类型仅定义了<Param, Progress, Result>
所具有的输入类型,这意味着execute()
的所有参数都属于Param
类型,onProgressUpdate
的所有参数类型都属于Progress
doInBackground()
Result
将返回class X extends AsyncTask<...>
类型的内容。泛型只定义了以后要求的东西的类型。
如果您有一个不错的IDE,当您定义execute()
时,它将为您提供填写所有正确类型的回调。
在你的第二个例子中 - 这并不意味着Param
期望3个字符串 - 实际上它需要一个或多个{{1}}类型的变量,因为它是一个varargs签名。在该方法中,您将引用单个实例,如访问数组。
答案 1 :(得分:1)
如果查看链接到的页面,则类型参数实际上名为Params
,Progress
和Result
。这就是类引用这些类型参数的方式。在他们的例子中,然后:
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等)