将接口传递给AsyncTask是一种很好的做法

时间:2011-08-31 04:33:14

标签: android interface android-asynctask

我有一个接口类

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类。 那么,这种方法是否可以解决我的问题呢?

2 个答案:

答案 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子类是非通用的。无论哪种方式,我都会编写任务类和命令实现,将它们放在一个包上,使它们成为单例(或在某些主类中有公共引用)并摆脱映射。