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

私はAsyncを使用し、本番環境で実装しました。発生する問題は、doInBackgroundでより多くのロジックを実行することです。これは、デバッグビルドを見ると、「Skipped X Frames」と表示されている場合は、doInBackgroundで多くの後処理を実行したい場合があるためです。

インターフェイスを使用するのが最善のアプローチであり、それが私のAsyncクラスを実装する方法です。full.stack.exは、その答えで頭に釘を打ちました。その答えは、非同期を拡張して目的に使用するための明確でシンプルで強力な方法を示しています。

于 2014-11-28T19:05:45.263 に答える