代理在Android中的应用,一行代码实现网络框架的切换

本文介绍了网络访问代理模式的实现,通过创建代理类控制对VolleyModel和OkHttpModel的实际对象引用,遵循开闭原则,仅需修改一行代码即可切换网络框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代理的定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。
开闭原则:代码的功能是开放的,对于已经写好的代码要做到关闭
下面介绍的这个案例是访问网络的代理实现
HttpProxy类是访问网络的代理,具体的被代理对象是VolleyModel 和 OkHttpModel
切换网络框架只要在MyAppcation中修改一行代码就ok,实现了编码的开闭原则

 public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
//        HttpProxy.init(VolleyModel.getInstance(context));
        HttpProxy.init(OKHttpModel.getInstance(context));
    }

代理类代码

// 代理类:它包含真正的对象,访问者对代理对象的访问,可以被代理对象转变成为真正的对象访问
public class HttpProxy implements IHttp {
    private static IHttp mHttp = null;
    /**
     * 请求URL
     */
    private String mUrl;
    /**
     * 请求参数
     */
    private Map<String, Object> mParams;

    private volatile static HttpProxy mInstance;

    public HttpProxy() {
        mParams = new HashMap<>();
    }

    public static HttpProxy obtain(){
        if (mInstance == null){
            synchronized (HttpProxy.class){
                if (mInstance == null){
                    mInstance = new HttpProxy();
                }
            }
        }
        return mInstance;
    }

    public static void init(IHttp http){
        mHttp = http;
    }

    @Override
    public void post(String url, Map<String, Object> params, ICallBack callBack) {
        //事情的事前准备工作
        mHttp.post(url,params,callBack);
        //事情的事后处理
    }

    @Override
    public <T> void get(String url, Map<String, Object> params, ICallBack<T> callBack) {
        //事情的事前准备工作
        mHttp.get(url,params,callBack);
        //事情的事后处理
    }
}

代理接口

//行为规范的接口,表示代理类能代理什么事情
public interface IHttp {
    void post(String url, Map<String,Object> params,ICallBack callBack);

    <T> void get(String url, Map<String,Object> params,ICallBack<T> callBack);

    //put

    //down

}

下面就是真正的被代理对象

public class VolleyModel implements IHttp {
    private static final String TAG = "VolleyModel";
    private static RequestQueue mQueue;
    private static volatile VolleyModel mInstance;

    private VolleyModel(Context context) {
        mQueue = Volley.newRequestQueue(context);
    }

    public static VolleyModel getInstance(Context context) {
        if (mInstance == null) {
            synchronized (HttpProxy.class) {
                if (mInstance == null) {
                    mInstance = new VolleyModel(context);
                }
            }
        }
        return mInstance;
    }

    @Override
    public void post(String url, Map params, ICallBack callBack) {

    }


    @Override
    public <T> void get(String url, Map<String, Object> params, final ICallBack<T> callBack) {
        String finalUrl = HttpUtils.appendParams(url, params);
        System.out.println("finalUrl : " + finalUrl);
        StringRequest request = new StringRequest(Request.Method.GET, finalUrl, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                System.out.println("response : " + response);
                Gson gson = new Gson();
                //1得到该泛型类的子类对象的Class对象,这个是获取类上面的泛型
//                Type genType = callBack.getClass().getGenericSuperclass();
//                System.out.println("genType : " + genType);
//                Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
//                System.out.println("genType 2 :" +params[0]);
//                T obj = gson.fromJson(response, params[0]);
//                这个是获取接口上面的泛型 Class
                Type[] types = callBack.getClass().getGenericInterfaces();
                ParameterizedType parameterizedType = (ParameterizedType) types[0];
                Type type = parameterizedType.getActualTypeArguments()[0];
                T obj = gson.fromJson(response, type);
                callBack.onSuccess(obj);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                callBack.onFailure(volleyError.toString());
            }
        });
        mQueue.add(request);
    }


    private static class HttpUtils {
        public static String appendParams(String url, Map<String, Object> params) {
            StringBuffer sb = new StringBuffer();
            sb.append(url);
            sb.append("?");
            Set<Map.Entry<String, Object>> entries = params.entrySet();
            for (Map.Entry<String, Object> set : entries) {
                sb.append(set.getKey()).append("=").append(set.getValue()).append("&");
            }
            return sb.toString();
        }
    }
}
public class OKHttpModel implements IHttp {
    private static final String TAG = "OKHttpModel";
    private static volatile OKHttpModel mInstance;

    private OKHttpModel() {
        //配置超时时间等信息
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
//                .addInterceptor(new LoggerInterceptor("TAG"))
                .connectTimeout(30000L, TimeUnit.MILLISECONDS)
                .readTimeout(30000L, TimeUnit.MILLISECONDS)
                //其他配置
                .build();

        OkHttpUtils.initClient(okHttpClient);
    }

    public static OKHttpModel getInstance(Context context) {
        if (mInstance == null) {
            synchronized (HttpProxy.class) {
                if (mInstance == null) {
                    mInstance = new OKHttpModel();
                }
            }
        }
        return mInstance;
    }

    @Override
    public void post(String url, Map params, ICallBack callBack) {

    }


    @Override
    public <T> void get(String url, Map<String, Object> params, final ICallBack<T> callBack) {
        String finalUrl = HttpUtils.appendParams(url, params);
        System.out.println("finalUrl : " + finalUrl);
        OkHttpUtils.get().url(finalUrl).build().execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                callBack.onFailure(e.getMessage());
            }

            @Override
            public void onResponse(String response, int id) {
                System.out.println("lgj :" + TAG + " ----------- ");
                Gson gson = new Gson();
                Type[] types = callBack.getClass().getGenericInterfaces();
                ParameterizedType parameterizedType = (ParameterizedType) types[0];
                Type type = parameterizedType.getActualTypeArguments()[0];
                T obj = gson.fromJson(response, type);
                callBack.onSuccess(obj);
            }
        });
    }


    private static class HttpUtils {
        public static String appendParams(String url, Map<String, Object> params) {
            StringBuffer sb = new StringBuffer();
            sb.append(url);
            sb.append("?");
            Set<Map.Entry<String, Object>> entries = params.entrySet();
            for (Map.Entry<String, Object> set : entries) {
                sb.append(set.getKey()).append("=").append(set.getValue()).append("&");
            }
            return sb.toString();
        }
    }
}

具体的调用如下:

  HttpProxy.obtain().get("https://api.jisuapi.com/astro/all", params, new ICallBack<ConstellationBean>() {
            @Override
            public void onFailure(String error) {

            }

            @Override
            public void onSuccess(ConstellationBean respose) {
                if (respose != null){
                    String msg = respose.getMsg();
                    System.out.println("msg : " + msg);
                }
            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值