【问题标题】:Execute generic AsyncTask执行通用 AsyncTask
【发布时间】:2014-12-03 13:18:13
【问题描述】:

我正在尝试编写一个执行通用 AsyncTasks 的静态实用程序函数。 我想出了这个:

public static void executeAsync(Class<? extends AsyncTask<?, ?, ?>> task, Object[] params) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    } else {
        task.execute(params);
    }
}

但它连编译都不够好..有什么想法吗?

【问题讨论】:

    标签: java android generics android-asynctask


    【解决方案1】:

    只使用:

    public static void executeAsync(AsyncTask<?, ?, ?> task, Object[] params) {
    

    代替:

    public static void executeAsync(Class<? extends AsyncTask<?, ?, ?>> task, // ...
    

    因为您不需要传递类,而是传递实际实例。

    编辑

    正如您在评论中提到的,还有一个参数化类型不匹配,因此您还需要调整参数类型。所以签名应该是这样的:

    public static void executeAsync(AsyncTask<Object, ?, ?> task, Object[] params) 
    

    或者(为了让它更“灵活”)

    public static <T> void executeAsync(AsyncTask<T, ?, ?> task, T... params) {
    

    如果您启用了 lint,也可以预期会出现抑制 lint 注释 @SuppressLint({ "InlinedApi", "NewApi" })

    【讨论】:

    • 谢谢。必须将 ? 更改为 Objects,所以请更新.. public static void executeAsync(AsyncTask task, Object[] params)
    • 你是对的。事实上,executeAsync(AsyncTask&lt;Object, ?, ?&gt; task, Object[] params) 就足够了——只有第一个参数化类型是相关的。
    • 调用函数时遇到问题.. GetGoogleProfileTask task = new GetGoogleProfileTask(data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME));执行异步(任务,空);给出编译错误
    • GetGoogleProfileTask 长什么样子?
    【解决方案2】:

    Params 属于 Object[] 类型,但 ASyncTask 属于“any”类型 (&lt;?&gt;)。但是 Java 不支持泛型数组。所以?[] params是不可能的。

    也许使用&lt;? extends Object&gt; 会有所帮助。

    【讨论】:

      【解决方案3】:

      使用Service更简单,可以多次启动

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-18
        • 2015-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多