我有一个接口类
public interface AsyncTaskExecuteCommand {
public Object executeCommand(String jsonLocation) throws IOException,JSONException;
}
我有一个存储此接口实例的HashMap
public static HashMap<String,AsyncTaskExecuteCommand> executeCommandHashMap
executeCommandHashMap.put(COMMAND_CORE_FIELD_FETCH, new AsyncTaskExecuteCommand() {
@Override
public Object executeCommand(String jsonLocation) throws IOException, JSONException{
//return some thing
}
});
executeCommandHashMap.put(COMMAND_REGISTER_FIELD_FETCH, new AsyncTaskExecuteCommand() {
@Override
public Object executeCommand(String jsonLocation) throws IOException,
JSONException {
//return some thing
}
});
我的AsyncTask名为GeneralAsyncTask包含
doInBackground(){
AsyncTaskExecuteCommand asyncTaskExecuteCommand = executeCommandHashMap.get(params[0]);
return asyncTaskExecuteCommand.executeCommand(params[1]);
}
这个AsyncTask被称为
new GeneralAsyncTask().execute(COMMAND_REGISTER_FIELD_FETCH,"http://something");
我这样做是因为我的AsyncTask的一般结构保持不变,即它做了一些方法执行并返回一些值。只有方法执行类型和返回值会有所不同。如果我不实现传递接口到异步任务,我最终创建了许多AsyncTask类。 那么,这种方法是否可以解决我的问题呢?
答案 0 :(得分:5)
似乎很复杂。您是否有理由不使用匿名类:
new AsyncTask<String, Void, Object>() {
@Override
protected Object doInBackground(String... url) {
//return some thing
}
protected void onPostExecute(Object result) {
// do something with result
}
}.execute("http://something");
答案 1 :(得分:2)
如果要对实现进行编码并将它们作为单独的类中的单独类进行编码,那么该接口是有意义的。这提高了可读性。如果目的不是每次都编写AsynkTask,因为它有一些共同的部分但只有doInBackground更改,那么我将AsyncTask扩展为接受GENERIC接口的具体泛型类,如下所示:
public interface MyTask<T,R> {
R doInBackground(T... param);
}
这个类会是这样的(未经测试):
public class MyAsyncTask<T, P, R> extends AsyncTask<T, P, R> {
private MyTask<T,R> task;
public MyAsyncTask(MyTask<T,R> todo){
task = todo;
}
protected R doInBackground(T... params) {
if(task != null){
return task.doInBackground(params);
} else {
return null;
}
}
//Other AsyncTask mandatory methods implemented here.
}
或者如果你没有泛型,那么接口和AsyncTask子类是非通用的。无论哪种方式,我都会编写任务类和命令实现,将它们放在一个包上,使它们成为单例(或在某些主类中有公共引用)并摆脱映射。