Android APP代理模式实现网络层隔离

个人学习的总结.

所谓的代理模式:申明一个共同的接口(代理接口),代理类与委托类实现这个共同的接口,重写相关的方法,代理类持有委托类对象的引用,代理类把要干的事交给委托类处理

代理模式:

APP网络层实现隔离:

1.定义一个代理接口

 */
public interface IHttpRequest {
    /**
     * @param url
     * @param params
     * @param iCallback get请求
     *
     */
    public void get(String url, Map<String, String> params, ICallback iCallback);

    /**
     * @param url
     * @param params
     * @param iCallback post请求
     */
    public void post(String url, Map<String, String> params, ICallback iCallback);
}

2.代理类实现代理接口

public class OkHttpRequestProcess implements IHttpRequest {

    private static volatile OkHttpRequestProcess instance;
    /**
     * 持有OkHttpRequest引用
     */
    private IHttpRequest mIHttpRequest;

    private OkHttpRequestProcess(IHttpRequest httpRequest) {
        this.mIHttpRequest = httpRequest;
    }

    public static void init(IHttpRequest httpRequest) {
        if (null == instance) {
            synchronized (OkHttpRequestProcess.class) {
                if (null == instance) {
                    instance = new OkHttpRequestProcess(httpRequest);
                }
            }
        }
    }

    public static OkHttpRequestProcess getInstance() {
        return instance;
    }

    /**
     * @param url
     * @param params
     * @param iCallback
     *  将请求分派给委托类执行
     */
    @Override

    public void get(String url, Map<String, String> params, ICallback iCallback) {
        mIHttpRequest.get(url, params, iCallback);
    }

    /**
     * @param url
     * @param params
     * @param iCallback
     */
    @Override
    public void post(String url, Map<String, String> params, ICallback iCallback) {
        mIHttpRequest.post(url, params, iCallback);
    }

3.干活的委托类

public class OkHttpRequest implements IHttpRequest {
    @Override
    public void get(String url, Map<String, String> params, final ICallback iCallback) {
        StringBuffer sb = new StringBuffer("?");
        //拼接 get请求 url
        if (null != params) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                sb.append(entry.getKey());
                sb.append("=");
                sb.append(entry.getValue());
                sb.append("&");
            }
        }
        sb.deleteCharAt(sb.length() - 1);
        url += sb.toString();

        //创建网络处理的对象
        OkHttpClient client = new OkHttpClient.Builder()
                //设置读取数据的时间
                .readTimeout(5, TimeUnit.SECONDS)
                //对象的创建
                .build();
        //创建一个网络请求的对象,如果没有写请求方式,默认的是get
        //在请求对象里面传入链接的URL地址
        Request request = new Request.Builder()
                .url(url).build();
        //call就是我们可以执行的请求类
        Call call = client.newCall(request);
        //异步方法,来执行任务的处理,一般都是使用异步方法执行的
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //失败
                iCallback.onFailed(0, e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //成功
                iCallback.onSuccess(response.body().string());
            }
        });
    }

    @Override
    public void post(String url, Map<String, String> params, ICallback iCallback) {

    }

4.在application初始化

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        /**
         * OkHttp请求
         */
//        OkHttpRequestProcess.init(new OkHttpRequest());

        /**
         * AsyncHttpClient请求
         */
        OkHttpRequestProcess.init(new AsyncHttpRequest());
    }
}

5.调用接口网络请求

Map<String, String> map = new HashMap<>();
map.put("g", "App");
map.put("c", "Home_app");
map.put("a", "App_is_personal");
map.put("uid", "840");
map.put("token", "a8310cd442757ae699df5d894f051");
OkHttpRequestProcess.getInstance().get("http://demo2.artmofang.com/app.php", map, new ModelCallback<MeInformationBean>() {
    @Override
    public void onFailed(int code, Throwable throwable) {

    }

    @Override
    public void onSuccess(String result) {
        super.onSuccess(result);
        Log.e(TAG, result.toString());
    }
});

参考:https://www.jianshu.com/p/2c36fa519cec


猜你喜欢

转载自blog.csdn.net/u014133119/article/details/80068362