0

この問題を解決しようとしています: AsyncTask から拡張されたクラスがあり、いくつかの http メソッドを実行します。次のようなものです。

    public class RESTManager extends AsyncTask<Object, Object, String>
{
    public RESTManager(String url, MethodTypes myMethod,ICallbackHandler hndl, String     restMethod)
    {
        initialize();
    }

    private String doGET()
    {
    }

    private String doPOST()
    {
    }

    @Override
    protected String doInBackground(Object... params)
    {

    }

    @Override
    protected void onPostExecute(String result)
    {
    }

}

だから、アクティビティから私はこれをやっています:

RESTManager webService = new WSManager(URL, MethodTypes.REGISTER, params, this, WSManager.GET_METHOD);
webService.execute();

次に、アクティビティは callbak メソッドで応答を受け取ります (アクティビティがこのインターフェイスを実装しているため)。

public void response(String response)
{
    // some process
}

これは正常に機能していますが、私の問題は、たとえば、関数への同じ呼び出しで回答が得られ、その関数が .execute メソッドを呼び出すことです。

// This is a new class
public class MyWebServices()
{
    public User getUser(int id)
    {
        User myUser;

        RESTManager webService = new WSManager(URL, MethodTypes.REGISTER, params, this, WSManager.GET_METHOD);
        webService.execute();

        // BUT I WANT TO RETURN FROM HERE THE CALL FROM THE ACTIVITY....LIKE

        return myUser;
    }
}

したがって、アクティビティから、これは次のようになります。

MyWebServices myService = new MyWebServices();
User usr = myService.getUser(id);

私が説明しようとしたことを理解してください、ありがとう!

4

2 に答える 2

1

コールバックを愛することを学ぶ:)

UIスレッドをブロックせずに、言及したパターンを適用することはできません(バックグラウンドで実行し、結果を待ち、値を返します)。

最も簡単なのはonPostExecute()、REST呼び出しの完了後に、実行したいことを呼び出すメソッドを実装することです。ただし、システムの他の部分へのクリーンなインターフェイスを公開したい場合は、より洗練されたものにすることができます。

オブザーバーパターンについて読むことから始めます。このように考えてください。REST呼び出しの完了はイベントであり、そのイベントに関心のあるコードは、完了時に通知されるように登録できます(非同期)。これを行うことができます。AsyncTaskimplを次のようにします。

AsyncTask myTask = new AsyncTask<...>() {
    public interface Callback {
        void onComplete();
        void onFailure();
    }

    private Set<Callback> callbacks = new HashSet<Callback>();

    public void addObserver(Callback cb) { callbacks.add(cb); }

    @Override
    protected String doInBackground(Object... params)
    {
        // whatever
    }

    @Override
    protected void onPostExecute(String result)
    {
        if (success) {
            for (Callback cb: callbacks) {
                cb.onComplete();
            }
        } else {
            for (Callback cb: callbacks) {
                cb.onFailure();
            }       
        }
    }
}

今、このインターフェースの消費者は次のようなことをします、

MyTask mt = new MyTask();
mt.addObserver(new MyTask.Callback() { 
    @Override
    public void onComplete() {
        // do whatever you want to do when the task completes successfully
    }

    @Override
    public void onFailure() {
        // ...
    }
}

mt.execute();
于 2012-04-17T14:52:06.260 に答える
1

あなたが望むものはUIをブロックすることにつながります。Android では、これを行うことはできません。ネットワーク呼び出しは非同期であるべきであるため、アプローチは間違っています。メソッドで対処しresponse()ます。

UPD : UI をブロックすると、ユーザーを悩ませる「アプリケーションが応答しないダイアログ」が表示されます。また、ネットワーク呼び出しが失敗した場合はどうなりますか? それとも、完了するまで 30 分待ちますか?

于 2012-04-17T14:37:08.870 に答える