执行通用的AsyncTask

时间:2014-12-03 13:18:13

标签: java android generics android-asynctask

我试图编写一个执行通用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);
    }
}

但它甚至不能编译......任何想法?

3 个答案:

答案 0 :(得分:1)

Params的类型为Object [],但ASyncTask的类型为&#34;任何&#34; (<?>)。但Java不支持一系列泛型。所以?[] params是不可能的。

也许使用<? extends Object>帮助。

答案 1 :(得分: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) 

或(为了使其更多&#34;灵活&#34;)

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

如果启用了lint,也可以预期压缩lint​​注释@SuppressLint({ "InlinedApi", "NewApi" })

答案 2 :(得分:0)

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