如何为aSyncTask创建一个Base类?

时间:2014-05-02 16:02:46

标签: android android-asynctask

我想为一些aSyncTasks创建一个基类。我创建了一个抽象类

public abstract class AsyncTaskBase<Params, Progress, Result> extends
    AsyncTask<Params, Progress, Result> {}

从它继承的两个AsyncTask类aSyncTaskA:

public class AsyncTaskA extends AsyncTaskBase<String, String, String> {

    @Override
    protected String doInBackground(String... params) 
    {
        return "A";
    }
}

从它继承的两个AsyncTask类aSyncTaskB:

public class AsyncTaskB extends AsyncTaskBase<String, String, String> {

    @Override
    protected String doInBackground(String... params) 
    {
        return "B";
    }

}

在调用方法中,我调用:

AsyncTaskBase asyncTask;

// Call aSyncA
asyncTask = new AsyncTaskA();
asyncTask.execute();

// Call aSyncB
asyncTask = new AsyncTaskB();
asyncTask.execute();

但是我收到以下错误消息

05-02 17:00:18.674: E/AndroidRuntime(20120): Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]

任何想法出了什么问题

1 个答案:

答案 0 :(得分:4)

发生错误是因为您在致电AsyncTask时未向#execute()传递任何参数。您声明AsyncTask采用String类型的参数,但您根本不传递任何内容。

您需要像这样致电#execute

asyncTask.execute( (String) null );

或者这个:

asyncTask.execute( (String[]) null );

如果您想在没有任何参数的情况下调用#execute,请将Params的泛型类型更改为Void。


此外,声明您在此处演示的确切基本异步是没有意义的。我假设你会在某些时候添加一些内容,但我认为通过一个基本异步至少为你处理泛型类型参数会更好,即 -

public abstract class BaseHttpAsync extends AsyncTask<Uri, Void, HttpResult>

声明public abstract class AsyncTaskBase<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {}有效地使您无益处。

相关问题