【问题标题】:Multiple Callback Design Pattern?多重回调设计模式?
【发布时间】:2014-09-19 11:59:43
【问题描述】:

这个问题与设计更相关。我正在使用 Android Async-Http-Client 库 http://loopj.com/android-async-http/ 从一个类中的不同方法发出多个调用请求,所以我的代码是这样的

RestClient.post(context, "", entity, "application/json", new JsonHttpResponseHandler() {
                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {

                }

                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) {
                    // Map objects from json using gson
                }
            });

如果我的类中的不同方法像上面的代码一样进行类似的调用,但请求参数不同,我如何封装 ResponseHandler 回调,这样我就不必在每个方法调用中重复它。想知道是否还有其他不错的设计模式方法可以在这里使用。

注意

我已经考虑过对其进行子类化,并且正如其他人所建议的那样,但我似乎无法以这种方式获得 json 对象响应。 谢谢

【问题讨论】:

    标签: android android-async-http


    【解决方案1】:

    所有这些请求的回调行为是否相同?如果是这样,您可以创建 JsonHttpResponseHandler 的单个共享实例并在任何地方使用它:

    private JsonHttpResponseHandler handler = new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(...) {
            ...
        }
    }
    
    ...
    
    RestClient.post(..., handler);
    

    或者你可以创建一个 JsonHttpResponseHandler 的子类并使用它:

    public class MyResponseHandler extends JsonHttpResponseHandler {
        @Override
        public void onSuccess(...) {
            ...
        }
    }
    
    ...
    
    RestClient.post(..., new MyResponseHandler());
    

    【讨论】:

    • 是的,我可以这样做,但我忘了添加这个。我的问题是由于某种原因,我无法以这种方式获得返回的 Json 响应。
    【解决方案2】:

    您不必为每个调用创建一个新的处理程序。

    JsonHttpResponseHandler myHandler = new JsonHttpResponseHandler() {
                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
    
                }
    
                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) {
                    // Map objects from json using gson
                }
            };
    
    RestClient.post( context, "", entity, "application/json", myHandler );
    

    【讨论】:

    • 感谢您的回复,我知道,但是由于它是异步的,如果可以一次调用方法,您怎么知道哪个调用是哪个?
    【解决方案3】:

    把它提取为方法怎么样:

    private void restClients(RestClient restClient){
        restClient.post(context, "", entity, "application/json", new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
    
            }
    
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) {
                // Map objects from json using gson
            }
        });
    }
    

    然后简单地调用方法:

    restClients(restclient1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 2016-10-11
      • 2017-07-21
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多