从回调响应中调用方法的最佳实践是什么?

Whats the Best Practice to call a method out of a Callback-Response?

我在我的项目中使用异步 XML-RPC-Client (https://github.com/gturri/aXMLRPC) 并使用此客户端的异步回调方法编写了一些方法,如下所示:

 public void xmlRpcMethod(final Object callbackSync) {
    XMLRPCCallback listener = new XMLRPCCallback() {
        public void onResponse(long id, final Object result) {
            // Do something
            if (callbackSync != null) {
                synchronized (callbackSync) {
                    callbackSync.notify();
                }
            }
        }

        public void onError(long id, final XMLRPCException error) {
            // Do something
            if (callbackSync != null) {
                synchronized (callbackSync) {
                    callbackSync.notify();
                }
            }
        }

        public void onServerError(long id, final XMLRPCServerException error) {
            Log.e(TAG, error.getMessage());
            if (callbackSync != null) {
                synchronized (callbackSync) {
                    callbackSync.notifyAll();
                }
            }
        }
    };

    XMLRPCClient client = new XMLRPCClient("<url>");
    long id = client.callAsync(listener, "<method>");

}

在其他方法中我喜欢调用此方法(此处"xmlRpcMethod")并等待它完成。我写了这样的方法:

public void testMethod(){
    Object sync = new Object();
    xmlRpcMethod(sync);
    synchronized (sync){
        try{
            sync.wait();
        }catch(Interrupted Exception e){
            e.printStackTrace();
        }
    }
    // Do something after xmlRcpFinished
}

但是当项目变大并且我需要等待许多请求完成时,这种等待和同步 get 的方式很难看。 那么这是唯一可能/最好的方法吗?或者有人知道更好的解决方案吗?

我创建阻塞 RPC 调用的第一个镜头是:

// Little helper class:
class RPCResult<T>{
     private final T result;
     private final Exception ex;
     private final long id;

     public RPCResult( long id, T result, Exception ex ){
        // TODO set fields
     }

     // TODO getters

     public boolean hasError(){ return null != this.ex; }
} 


public Object xmlRpcMethod() {
    final BlockingQueue<RPCResult> pipe = new ArrayBlockingQueue<RPCResult>(1);
    XMLRPCCallback listener = new XMLRPCCallback() {
        public void onResponse(long id, final Object result) {
            // Do something
            pipe.put( new RPCResult<Object>(id, result, null) );
        }

        public void onError(long id, final XMLRPCException error) {
            // Do something
            pipe.put( new RPCResult<Object>(id, null, error) );
        }

        public void onServerError(long id, final XMLRPCServerException error) {
            Log.e(TAG, error.getMessage());
            pipe.put(new RPCResult<Object>(id, null, error));
        }
    };

    XMLRPCClient client = new XMLRPCClient("<url>");
    long id = client.callAsync(listener, "<method>");
    RPCResult result = pipe.take(); // blocks until there is an element available 
    // TODO: catch and handle InterruptedException!
    if( result.hasError() ) throw result.getError(); // Relay Exceptions - do not swallow them!
    return result.getResult();
}

客户:

public void testMethod(){
    Object result = xmlRpcMethod(); // blocks until result is available or throws exception
}

下一步是制作强类型版本 public T xmlRpcMethod()