我正在使用 AsyncTask 类来执行 WS 方法。我想要一个通用的异步任务类来调用 WS 中的任何方法。
我创建了一组可以正常工作的类,但问题是当我必须更新 UI 时。我知道我可以使用对 Activity 类的引用创建异步任务,然后执行所需的方法,但我想要的是执行的方法也是一个参数。
否则,我必须为与 UI 交互的每个方法实现一个新类,因为每个操作因方法而异。
可证明的解决方案是使用结合参数的监听器,但我没有找到如何使用它的完整示例。
我正在使用 AsyncTask 类来执行 WS 方法。我想要一个通用的异步任务类来调用 WS 中的任何方法。
我创建了一组可以正常工作的类,但问题是当我必须更新 UI 时。我知道我可以使用对 Activity 类的引用创建异步任务,然后执行所需的方法,但我想要的是执行的方法也是一个参数。
否则,我必须为与 UI 交互的每个方法实现一个新类,因为每个操作因方法而异。
可证明的解决方案是使用结合参数的监听器,但我没有找到如何使用它的完整示例。
在 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();
通过 WS ,您的意思是 web 服务?
asyncTask 不适合用于如此长的任务。他们应该做一些小任务。需要(大约)不到 5 秒的事情。
如果您希望执行很长的任务,请使用简单的线程并考虑将其放入服务中。
此外,为了与之通信,您可以与服务通信,当您需要向 UI 线程发布某些内容时,请使用处理程序。
最接近的答案是这个
您可以在同一 UI 中选择等待后台进程结束的方法
我会使用异步,并且我在生产实现中使用过。您将遇到的问题是在 doInBackground 中执行更多逻辑,因为如果您在看到调试构建时看到它说“跳过 X 帧”,您可能仍希望在 doInBackground 中进行大量后期处理。
使用接口是最好的方法,这就是我实现 Async 类的方式。full.stack.ex 用这个答案一针见血。该答案显示了一种清晰、简单、强大的方式来扩展 Async 并将其用于您的目的。