首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >回调重复代码

回调重复代码
EN

Stack Overflow用户
提问于 2016-08-19 18:39:35
回答 1查看 105关注 0票数 0

我使用带有异步回调的okhttp3从服务器获取JSONArray/JSONObjects,然后解析它们并创建特定的对象,该对象被传递给回调函数。大多数回调代码对于每个方法都是相同的,但有一些代码行是不同的。有没有一种模式可以用来减少代码行数,这样我就不必为不同的对象一遍又一遍地编写相同的代码?我标记了每种方法不同的代码行。我遇到的问题是在不使用switch/case和改变回调对象的情况下调用特定的JSON解析函数。

代码语言:javascript
代码运行次数:0
运行
复制
//-----------------------differs-------------------------
public void getUser(final HTTPResponseCallback<User> callback)
{
    //-----------------------differs-------------------------
    final String url = domain + USERS;
    //-------------------------------------------------------

    okHttpClient.newCall(buildRequest(url)).enqueue(new Callback()
    {
        Handler handler = new Handler(Looper.getMainLooper());

        @Override
        public void onFailure(Call call, IOException e)
        {
            handler.post(new Runnable()
            {
                @Override
                public void run()
                {
                    callback.onFailure();
                }
            });
        }

        @Override
        public void onResponse(Call call, final Response response) throws IOException
        {
            if (response.isSuccessful())
            {
                try
                {
                    String responseBody = response.body().string();

                    //-----------------------differs-------------------------
                    JSONObject jsonResponse = new JSONObject(responseBody);
                    final User user = JsonParser.parseUser(jsonResponse
                    //------------------------------------------------------

                    handler.post(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            //---------------------------------------last parameter differs----------------------------------------------
                            callback.onSuccess(new HTTPTransaction(response.code(), response.message(), response.header("ETag")), user);
                            //-----------------------------------------------------------------------------------------------------------
                        }
                    });

                }
                catch (JSONException e)
                {
                    ...
                }
            }
            else
                ...

         }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-19 18:53:28

1)使用<T>参数化的Make,因为类型可以不同:

代码语言:javascript
代码运行次数:0
运行
复制
public class CallBackWrapper<T> { 
    ...
    public void getUser(final HTTPResponseCallback<T> callback) { ...

2)为唯一分块引入回调对象,返回T类型的实例

代码语言:javascript
代码运行次数:0
运行
复制
interface Worker {
   T run(String responseBody);
}

public <T> void getUser(final HTTPResponseCallback<T> callback, Worker worker) { ...

3)调用需要的worker:

代码语言:javascript
代码运行次数:0
运行
复制
                String responseBody = response.body().string();

                //-----------------------differs-------------------------
                final T obj = worker.run(responseBody);
                //------------------------------------------------------

                handler.post(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        //---------------------------------------last parameter differs----------------------------------------------
                        callback.onSuccess(new HTTPTransaction(response.code(), response.message(), response.header("ETag")), obj);
                        //-----------------------------------------------------------------------------------------------------------
                    }
                });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39036954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档