繁体   English   中英

关于 AsyncTask 中 Java generics 的问题

[英]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类型,那些onProgressUpdateProgress并且doInBackground()将返回一些类型Result generics 只定义了以后预期的东西的类型

如果您有一个不错的 IDE,当您定义class X extends AsyncTask<...>时,它将为您提供所有正确类型都填写的回调。

在您的第二个示例中——这并不意味着execute()需要 3 个字符串——实际上它需要一个或多个Param类型的变量,因为它是一个可变参数签名。 在该方法中,您将引用单个实例,例如访问数组。

如果您查看链接到的页面,类型参数实际上被命名为ParamsProgressResult 这就是 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM