[英]Question regarding Java generics in AsyncTask
Android 文档有一个使用 AsyncTask 的示例,在此示例中,DownloadFilesTask class 以一种相当奇怪的方式扩展了 AsyncTask(至少对于初学者而言):
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
AsyncTask 不应该接受类型变量而不是原始类型吗? 如果我想在所有 3 个参数中输入字符串会发生什么? 像这样:
private class DownloadFilesTask extends AsyncTask<String, String, String> {
class 然后如何单独引用这些参数?
这些通用类型仅定义<Param, Progress, Result>
的输入类型,这意味着所有要execute()
的参数都是Param
类型,那些onProgressUpdate
是Progress
并且doInBackground()
将返回一些类型Result
。 generics 只定义了以后预期的东西的类型。
如果您有一个不错的 IDE,当您定义class X extends AsyncTask<...>
时,它将为您提供所有正确类型都填写的回调。
在您的第二个示例中——这并不意味着execute()
需要 3 个字符串——实际上它需要一个或多个Param
类型的变量,因为它是一个可变参数签名。 在该方法中,您将引用单个实例,例如访问数组。
如果您查看链接到的页面,类型参数实际上被命名为Params
、 Progress
和Result
。 这就是 class 引用这些类型参数的方式。 在他们的例子中,然后:
URL
Params
Progress
绑定到Integer
类型Result
绑定到Long
类型请参阅有关每种类型的用途的文档。
Android 文档解释说 class AsyncTask 有 3 个参数: android.os.AsyncTask<Params, Progress, Result>
因此,第一个 class 参数定义了传递给 AsyncTask 的 arguments 的类型。 显然,这取决于您的任务。 以 URL 为例,但您可以使用任何 class 或原始包装器。
第二个 class 参数可帮助您定义在任务执行期间如何获取状态更新。 使用 Integer 表示该示例可以估计任务完成的百分比。 您可以改用 String 来定义任务阶段(例如启动、连接、解析、分析、关闭......)
结果定义了您的任务返回什么。 您可以在此处使用任何类型。
顺便说一句,我建议您阅读有关 java generics 的内容。 它可以帮助您学习其他 API。
It's accepting primitive types because of java auto-boxing feature: Integer and int are interchangeable - java will use Integer.getInt() if the code needs an int, or use new Integer(int) if it needs an Integer etc. This applies to所有原始类型及其对应的 class(long 与 Long、float 与 Float 等)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.