Android中ws调用的通用asynctask

时间:2012-09-17 18:12:21

标签: android android-asynctask

我正在使用AsyncTask类来执行WS方法。我想有一个通用的异步任务类来调用WS中的任何方法。

我创建了一组工作正常的类,但问题是我必须更新UI。我知道我可以通过对Activity类的引用来创建异步任务,然后执行所需的方法,但我想要的是执行的方法也是一个参数。

否则我必须为每个与UI交互的方法实现一个新类,因为每个操作都有所不同,具体取决于方法。

很明显,解决方案是使用Listeners与参数结合使用,但我没有找到如何使用它的完整示例。

3 个答案:

答案 0 :(得分:2)

在Java中,您不能将方法作为参数传递,但是您可以传递扩展或实现祖先的对象并覆盖该方法。 Command模式使用了这个概念(http://en.wikipedia.org/wiki/Command_pattern)。

以下是该方法的概念:

private static interface Command {
    public void execute();
}

public static final class MyWsCommand1 implements Command {
    @Override
    public void execute() {
        // TODO your WS code 1
    }
}

public static final class MyWsCommand2 implements Command {
    @Override
    public void execute() {
        // TODO your WS code 2
    }
}

private static class GenericAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {

    private Command command;

    public GenericAsyncTask(Command command) {
        super();
        this.command = command;
    }

    @Override
    protected Result doInBackground(Params... params) {
        // TODO your code
        command.execute();
        // TODO your code
        return null;
    }

}

private GenericAsyncTask<Object, Object, Object> myAsyncTask1;
private GenericAsyncTask<Object, Object, Object> myAsyncTask2;

并在您的代码中使用它们:

myAsyncTask1 = new GenericAsyncTask<Object, Object, Object>(new MyWsCommand1());
    myAsyncTask1.execute();

...

    myAsyncTask2 = new GenericAsyncTask<Object, Object, Object>(new MyWsCommand2());
    myAsyncTask2.execute();

答案 1 :(得分:1)

WS的

是指webservice吗?

asyncTask并不意味着用于这么长的任务。他们应该做小任务。需要(大约)少于5秒的东西。

如果您希望执行很长的任务,请使用简单的线程并考虑将其放入服务中。

另外,为了与之通信,您可以与服务进行通信,当您需要向UI线程发布内容时,请使用处理程序。

答案 2 :(得分:0)

我会使用Async,而我是在生产实现上做的。您遇到的问题是在doInBackground中执行更多逻辑,因为如果您在任何时候看到调试版本时都会看到&#34; Skipped X Frames&#34;你可能还想在doInBackground中进行大量的后期处理。

使用界面是最好的方法,它是我实现Async类的方式。 full.stack.ex用那个答案击中了头上的钉子。该答案显示了一种清晰,简单,强大的方法来扩展Async并将其用于您的目的。