1

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

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

否则,我必须为与 UI 交互的每个方法实现一个新类,因为每个操作因方法而异。

可证明的解决方案是使用结合参数的监听器,但我没有找到如何使用它的完整示例。

4

4 回答 4

2

在 Java 中,不能将方法作为参数传递,但可以传递扩展或实现祖先并覆盖该方法的对象。命令模式使用这个概念 (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();
于 2012-09-17T19:42:30.633 回答
1

通过 WS ,您的意思是 web 服务?

asyncTask 不适合用于如此长的任务。他们应该做一些小任务。需要(大约)不到 5 秒的事情。

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

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

于 2012-09-17T19:42:28.647 回答
1

最接近的答案是这个

您可以在同一 UI 中选择等待后台进程结束的方法

于 2012-09-20T14:54:46.870 回答
0

我会使用异步,并且我在生产实现中使用过。您将遇到的问题是在 doInBackground 中执行更多逻辑,因为如果您在看到调试构建时看到它说“跳过 X 帧”,您可能仍希望在 doInBackground 中进行大量后期处理。

使用接口是最好的方法,这就是我实现 Async 类的方式。full.stack.ex 用这个答案一针见血。该答案显示了一种清晰、简单、强大的方式来扩展 Async 并将其用于您的目的。

于 2014-11-28T19:05:45.263 回答