Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中ws调用的通用异步任务_Android_Android Asynctask - Fatal编程技术网

Android中ws调用的通用异步任务

Android中ws调用的通用异步任务,android,android-asynctask,Android,Android Asynctask,我使用AsyncTask类来执行WS方法。我希望有一个通用的异步任务类来调用WS中的任何方法 我创建了一组工作正常的类,但问题是当我必须更新UI时。我知道我可以通过引用Activity类创建异步任务,然后执行所需的方法,但我希望执行的方法也是一个参数 否则,我必须为每个与UI交互的方法实现一个新类,因为每个操作都因方法而异 可以证明,解决方案是将侦听器与参数结合使用,但我没有找到一个完整的示例来说明如何使用它。所说的WS是指webservice asyncTask不适用于这样长的任务。他们应该做

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

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

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


可以证明,解决方案是将侦听器与参数结合使用,但我没有找到一个完整的示例来说明如何使用它。

所说的WS是指webservice

asyncTask不适用于这样长的任务。他们应该做一些小任务。花费(大约)少于5秒的时间

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


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

所说的WS是指webservice

asyncTask不适用于这样长的任务。他们应该做一些小任务。花费(大约)少于5秒的时间

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


此外,为了与它通信,您可以与服务通信,并且当您需要向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;
private静态接口命令{
公共无效执行();
}
公共静态最终类MyWsCommand1实现命令{
@凌驾
public void execute(){
//TODO您的WS-code 1
}
}
公共静态最终类MyWsCommand2实现命令{
@凌驾
public void execute(){
//TODO您的WS代码2
}
}
私有静态类GenericAsyncTask扩展了AsyncTask{
私人指挥部;
公共GenericAsyncTask(命令){
超级();
this.command=命令;
}
@凌驾
受保护的结果doInBackground(参数…参数){
//TODO您的代码
command.execute();
//TODO您的代码
返回null;
}
}
专用GenericAsyncTask myAsyncTask1;
专用GenericAsyncTask myAsyncTask2;
并在代码中使用这些选项:

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

myAsyncTask2=new-genericacynctask(new-MyWsCommand2());
myAsyncTask2.execute();

在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;
private静态接口命令{
公共无效执行();
}
公共静态最终类MyWsCommand1实现命令{
@凌驾
public void execute(){
//TODO您的WS-code 1
}
}
公共静态最终类MyWsCommand2实现命令{
@凌驾
public void execute(){
//TODO您的WS代码2
}
}
私有静态类GenericAsyncTask扩展了AsyncTask{
私人指挥部;
公共GenericAsyncTask(命令){
超级();
this.command=命令;
}
@凌驾
受保护的结果doInBackground(参数…参数){
//TODO您的代码
command.execute();
//TODO您的代码
返回null;
}
}
专用GenericAsyncTask myAsyncTask1;
专用GenericAsyncTask myAsyncTask2;
并在代码中使用这些选项:

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

myAsyncTask2=new-genericacynctask(new-MyWsCommand2());
myAsyncTask2.execute();
最接近的答案是

您可以在同一UI中选择等待后台进程结束的方法,最接近的答案是


您可以在同一UI中选择方法,该UI将等待后台进程结束,我将使用Async,我在生产实现中使用了Async。您将遇到的问题是在doInBackground中执行更多的逻辑,因为如果您在任何时候看到调试构建时说“跳过了X帧”,您可能仍然希望在doInBackground中执行大量后处理


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

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


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

真的吗?我用asyncTask实现它,因为我认为这是最好的选择。因此,您建议使用线程,这很好,但是如何使用处理程序进行后期处理?使用AsyncTask进行长时间操作?嗯,您的WS调用实际上可能不会太长。但这不是重点。事实上,您可以从活动的onPause()中快速取消和清理异步任务非常重要