我正在使用AsyncTask类来执行WS方法。我想有一个通用的异步任务类来调用WS中的任何方法。
我创建了一组工作正常的类,但问题是我必须更新UI。我知道我可以通过对Activity类的引用来创建异步任务,然后执行所需的方法,但我想要的是执行的方法也是一个参数。
否则我必须为每个与UI交互的方法实现一个新类,因为每个操作都有所不同,具体取决于方法。
很明显,解决方案是使用Listeners与参数结合使用,但我没有找到如何使用它的完整示例。
答案 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)
是指webservice吗?
asyncTask并不意味着用于这么长的任务。他们应该做小任务。需要(大约)少于5秒的东西。
如果您希望执行很长的任务,请使用简单的线程并考虑将其放入服务中。
另外,为了与之通信,您可以与服务进行通信,当您需要向UI线程发布内容时,请使用处理程序。
答案 2 :(得分:0)
我会使用Async,而我是在生产实现上做的。您遇到的问题是在doInBackground中执行更多逻辑,因为如果您在任何时候看到调试版本时都会看到&#34; Skipped X Frames&#34;你可能还想在doInBackground中进行大量的后期处理。
使用界面是最好的方法,它是我实现Async类的方式。 full.stack.ex用那个答案击中了头上的钉子。该答案显示了一种清晰,简单,强大的方法来扩展Async并将其用于您的目的。