这里会沿用上篇文章的代码
Android MVP 构建一个简单的MVPhttps://blog.csdn.net/hongxue8888/article/details/100888697

参考:

免费开放接口API
https://www.jianshu.com/p/e6f072839282

Android MVP 构建一个简单的MVP
https://blog.csdn.net/hongxue8888/article/details/100888697

代码Github:https://github.com/345166018/AndroidMVP/tree/master/HxMVP2

在App版本迭代中,有可能会跟换框架,比如网络框架可能会从volley替换为okhttp或者retrofit,或者图片加载框架从ImageLoader替换为Glide,那在我们如何在项目中使用一行代码来完成框架的替换?

简单的思路:添加一个隔离层,帮App选择需要的框架,并提供相应的接口。App使用隔离层提供的接口即可。
在这里插入图片描述
具体实现就是通过: 注解 + 动态代理

动态代理类图如下所示:
在这里插入图片描述

客户想买房,并不会直接找业主买房,而是通过房产公司。房产公司会有一些业务员,业务员会查看公司登记了哪些在卖的房子。而这些在卖的房子真正是属于这些业主的。房产公司具备卖房的能力,而真正进行卖房动作的是业务员,业务员会持有业主的一个引用,卖房的过程由业务员和业主进行交互。

App可以理解为客户;房产公司和业务员可以理解为隔离层;volley、okhttp、retrofit等框架可以理解为业主。

retrofit和rxjava后面讲解

新建Android Library 名为 isolation_processor

添加依赖:

implementation 'com.android.volley:volley:1.1.0'
implementation 'com.google.code.gson:gson:2.2.4'
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'org.xutils:xutils:3.3.36'

新建IHttpProcessor接口,相当于房产公司,里面可以定义各种网络操作的方法,如post、get等。

1. 房产公司

/**
 * 房产公司
 */
public interface IHttpProcessor {
    /**
     * 网络操作  get post del update put select.......
     */
    void post(String url, Map<String, Object> params, ICallback callback);
}

新建一个顶层回调接口ICallback,

/**
 * 顶层回调接口(json,xml,....)
 *
 */
public interface ICallback {
    void onSuccess(String result);
    void onFailure(String e);
}

ICallback中的onSuccess返回的是String类型,如果想直接返回一个json转换后的对象,我可以定义一个HttpCallback实现ICallback接口,然后将json字符串转换为我们需要的对象。

/**
 * 回调接口的json版本的实现类
 * 用于把网络返回的json字符串转让换成对象(Result就是用户接收数据的类型)
 * //ResponceData就是Result
 */
public abstract class HttpCallback<Result> implements ICallback {
    @Override
    public void onSuccess(String result) {//result就是网络回来的数据
        //result把转换成用户需要的对象
        Gson gson=new Gson();
        //需要得到用户输入的对象对应的字节码是什么样的
        //得到用户接收数据的对象对应的class
        Class<?> clz=analysisClassInfo(this);

        Result objResult=(Result)gson.fromJson(result,clz);

        //把已经转好的对象,交给用户
        onSuccess(objResult);
    }

    public abstract void onSuccess(Result result);

    private Class<?> analysisClassInfo(Object object) {
        //getGenericSuperclass可以得到包含原始类型,参数化类型,数组,类型变量,基本数据
        Type genType=object.getClass().getGenericSuperclass();
        //获取参数化类型
        Type[] params=((ParameterizedType)genType).getActualTypeArguments();
        return (Class<?>)params[0];
    }

    @Override
    public void onFailure(String e) {

    }
}

2. 代理类(业务员)

/**
 * 代理类(业务员)
 */
public class HttpHelper implements IHttpProcessor {

    //单例
    private static HttpHelper instance;

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

    private HttpHelper() {
    }

    private static IHttpProcessor mIHttpProcessor;

    //定义一个API,用来设置代码的接口(业务员找到一个对应的有房的人)
    public static void init(IHttpProcessor iHttpProcessor) {
        mIHttpProcessor = iHttpProcessor;
    }

    @Override
    public void post(String url, Map<String, Object> params, ICallback callback) {
        //http://www.aaa.bbb/index
        //user=hongxue&pwd=123
        //http://www.aaa.bbb/index?&user=hongxue&pwd=123
        String finalUrl = appendParams(url, params);
        mIHttpProcessor.post(finalUrl, params, callback);
    }

    public static String appendParams(String url, Map<String, Object> params) {
        if (params == null || params.isEmpty()) {
            return url;
        }
        StringBuilder urlBuilder = new StringBuilder(url);
        if (urlBuilder.indexOf("?") <= 0) {
            urlBuilder.append("?");
        } else {
            if (!urlBuilder.toString().endsWith("?")) {
                urlBuilder.append("&");
            }
        }
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            urlBuilder.append("&" + entry.getKey())
                    .append("=")
                    .append(encode(entry.getValue().toString()));
        }
        return urlBuilder.toString();
    }

    private static String encode(String str) {
        try {
            return URLEncoder.encode(str, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }

}

3. 业主

3.1 业主1-OkHttpProcessor

public class OkHttpProcessor implements IHttpProcessor {
    private OkHttpClient mOkHttpClient;
    private Handler myHandler;

    public OkHttpProcessor() {
        mOkHttpClient = new OkHttpClient();
        myHandler = new Handler();
    }

    private RequestBody appendBody(Map<String, Object> params) {
        FormBody.Builder body = new FormBody.Builder();
        if (params == null || params.isEmpty()) {
            return body.build();
        }
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            body.add(entry.getKey(), entry.getValue().toString());
        }
        return body.build();
    }

    @Override
    public void post(String url, Map<String, Object> params, final ICallback callback) {
        RequestBody requestBody = appendBody(params);
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String result = response.body().string();
                if (response.isSuccessful()) {
                    myHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onSuccess(result);
                        }
                    });
                }

            }
        });
    }
}

3.2 业主2-VolleyProcessor

public class VolleyProcessor implements IHttpProcessor {

    private static RequestQueue mQueue = null;

    public VolleyProcessor(Context context) {
        mQueue = Volley.newRequestQueue(context);
    }

    @Override
    public void post(String url, Map<String, Object> params, final ICallback callback) {
        StringRequest stringRequest = new StringRequest(
                Request.Method.POST,
                url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        callback.onSuccess(response);

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }
        );
        mQueue.add(stringRequest);
    }
}

4. 客户(App)

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //进行框架的选择
//        HttpHelper.init(new VolleyProcessor(this));
        HttpHelper.init(new OkHttpProcessor());
//        HttpHelper.init(new XUtilsProcessor(this));
//        HttpHelper.init(new RetrofitProcessor());
    }
}

 		String url="https://www.apiopen.top/satinApi";
        HashMap<String,Object> params=new HashMap<>();
        params.put("type","1");
        params.put("page","1");
        HttpHelper.obtain().post(url, params, new HttpCallback<DuanziRootBean>() {
            @Override
            public void onSuccess(DuanziRootBean bean) {
                Log.i("hongxue resultcode = ",bean.getCode() + "");
            }
        });

代码Github:https://github.com/345166018/AndroidMVP/tree/master/HxMVP2

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐