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

文章目录

  • 1. 房产公司
  • 2. 代理类(业务员)
  • 3. 业主
    • 3.1 业主1-OkHttpProcessor
    • 3.2 业主2-VolleyProcessor
  • 4. 客户(App)

参考:

免费开放接口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 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 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 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 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 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 params) {        FormBody.Builder body = new FormBody.Builder();        if (params == null || params.isEmpty()) {            return body.build();        }        for (Map.Entry entry : params.entrySet()) {            body.add(entry.getKey(), entry.getValue().toString());        }        return body.build();    }    @Override    public void post(String url, Map 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 params, final ICallback callback) {        StringRequest stringRequest = new StringRequest(                Request.Method.POST,                url,                new Response.Listener() {                    @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 params=new HashMap<>();        params.put("type","1");        params.put("page","1");        HttpHelper.obtain().post(url, params, new HttpCallback() {            @Override            public void onSuccess(DuanziRootBean bean) {                Log.i("hongxue resultcode = ",bean.getCode() + "");            }        });

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

更多相关文章

  1. android驱动学习---led实验
  2. RestHttp
  3. Android用户手势检测
  4. Android(安卓)aidl接口远程调用
  5. Parcelable
  6. Android(安卓)Parcelable
  7. Android类库介绍
  8. Android(安卓)LCD(三):Samsung LCD接口篇
  9. [读书笔记]intent.putExtra的使用与原理分析

随机推荐

  1. go语言中channel的详细介绍
  2. .go是什么文件
  3. getch()的功能是什么
  4. go语言基础
  5. C语言字符串输出函数puts()的作用是什么
  6. c语言绝对值怎么打
  7. go语言适合做什么?
  8. 复数型是c语言的数据类型吗?
  9. Visual C++2010如何编写并运行C++程序
  10. go 为什么比php性能高